Кажется, существует много примеров при реализации шаблона Репозитория для Linq к SQL. Большинство из них показывающий IRepository и DI; Некоторые реализовали Единицу работы и некоторых нет. Я пытался читать как большинство результатов, возвращенных поисками на ТАК и Google на Linq к шаблонам репозитория SQL. Тем не менее, я еще не столкнулся с полным решением.
От моих чтений я реализовал шаблон репозитория как показано ниже:
Я использую 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.
Как я расширяю этот шаблон так, чтобы я мог сохранить данные к Базе данных. Я хотел бы пасовать назад Бизнес-объекты в репозиторий и сохранить их. Действительно ли это возможно? Как я могу реализовать Единицу работы в таком сценарии.