Шаблон репозитория с Linq к использованию SQL МОК, Внедрение зависимости, Единица работы

Кажется, существует много примеров при реализации шаблона Репозитория для Linq к SQL. Большинство из них показывающий IRepository и DI; Некоторые реализовали Единицу работы и некоторых нет. Я пытался читать как большинство результатов, возвращенных поисками на ТАК и Google на Linq к шаблонам репозитория SQL. Тем не менее, я еще не столкнулся с полным решением.

От моих чтений я реализовал шаблон репозитория как показано ниже:

repository pattern

Я использую DI для регистрации интерфейсов, от которых зависятся репозитории:

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

Реализация шаблона Репозитория:

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)
    {
    }
}

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);
}

Класс репозитория реализован как ниже с реализациями IRepository (не показанный) и имеет зависимость от IDataContextFactory, о котором заботится DI:

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

Репозитории используются с помощью МОК:

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

Я возвращаю результат запросов как набор Бизнес-объекта для предотвращения зависимости от Linq к SQL на прикладных уровнях, где я использую репозиторий. Вышеупомянутый сценарий хорошо работает с моим приложением WPF, которое использует шаблон MVVM. У меня есть классы ViewModel aks Предъявителя, которые не зависятся классов, сгенерированных Linq-SQL.

Как я расширяю этот шаблон так, чтобы я мог сохранить данные к Базе данных. Я хотел бы пасовать назад Бизнес-объекты в репозиторий и сохранить их. Действительно ли это возможно? Как я могу реализовать Единицу работы в таком сценарии.

6
задан 2 revs 8 February 2017 в 14:16
поделиться