Wzór repozytorium z Linq do SQL przy użyciu IoC, Dependency Injection, Unit of Work

Wydaje się, że istnieje wiele przykładów implementacji wzorca repozytorium dla Linq do SQL. Większość z nich zawiera IRepository i DI; Niektóre wdrożyły jednostkę pracy, a inne nie. Próbowałem odczytać większość wyników zwracanych przez wyszukiwanie SO i Google na Linq do wzorców repozytorium SQL. Niemniej jednak nie znalazłem jeszcze kompletnego rozwiązania.

Z moich odczytów zaimplementowałem wzór repozytorium, jak pokazano poniżej:

Używam DI do rejestrowania interfejsów, od których zależą repozytoria:

this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(),
    new InjectionConstructor(connectionString));
this.container.RegisterType<IDataContextFactory, DataContextFactory>();

Implementacja wzorca repozytorium:

public interface IPrivilegeRepository : IRepository<PrivilegesEntity>
{
   IList<MenuModel> GetRootMenu();
   IList<MenuModel> GetChildMenu(int parentId);
}

public class PrivilegeRepository : Repository<PrivilegesEntity>, IPrivilegeRepository
{
    #region IPrivilegeRepository Members

    public IList<MenuModel> GetRootMenu()
    {
        return FindAll(menu => menu.ParentId == null)
            .OrderBy(menu => menu.SortOrder)
            .Select(c => EntityMapper.Privileges.ToBusinessObject(c))
            .ToList();
    }

    public IList<MenuModel> GetChildMenu(int parentId)
    {
        return FindAll(menu => menu.ParentId == parentId)
            .OrderBy(menu => menu.SortOrder)
            .Select(menu => EntityMapper.Privileges.ToBusinessObject(menu))
            .ToList();
    }

    #endregion

    public PrivilegeRepository(IDataContextFactory dataContextFactory)
        : base(dataContextFactory)
    {
    }
}

Ogólny interfejs IRepository:

public interface IRepository<T> where T : class
{
    IEnumerable<T> All();
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp);
    T Single(Expression<Func<T, bool>> exp);
    T First(Expression<Func<T, bool>> exp);
}

Klasa repozytorium jest zaimplementowana jak poniżej wraz z implementacjami IRepository (nie pokazano) i jest zależna od IDataContextFactory, którym zajmuje się DI:

public class Repository<T> : IRepository<T> where T : class
{
    public Repository(IDataContextFactory dataContextFactory)
    {
        this.dataContextFactory = dataContextFactory;
    }
}

Repozytoria są zużywane przy użyciu IoC:

PrivilegeRepository repository = container.Resolve<PrivilegeRepository>();

Zwracam wyniki zapytań jako zbiór Business Object, aby uniknąć zależności od Linq do SQL na warstwach aplikacji, w których korzystam z repozytorium. Powyższy scenariusz działa poprawnie z moją aplikacją WPF, która używa wzorca MVVM. Mam klasy Viewerów ViewModel aks, które nie zależą od klas generowanych przez Linq-SQL.

Jak rozszerzyć ten wzór, aby móc zapisać dane w bazie danych. Chciałbym przekazać obiekty biznesowe z powrotem do repozytorium i zapisać je. Czy to możliwe? Jak mogę wdrożyć jednostkę pracy w takim scenariuszu.

questionAnswers(2)

yourAnswerToTheQuestion