Я хотел бы реализовать простые интерфейсы IGenericRepository и IUnitOfWork в моем приложении, но я не уверен, что это лучший способ сделать это.Единица работы и шаблон хранилища
Насколько я понял, UnitOfWork следует использовать для записи, в то время как репозиторий должен использоваться для чтения. Я столкнулся с одной архитектурой, и мне это очень нравится, но я нашел интерфейсы, а не реализации, и я не уверен, как их реализовать.
public interface IGenericRepository : IDisposable
{
IUnitOfWork CreateUnitOfWork();
T FirstOrDefault<T>(Expression<Func<T, bool>> predicate) where T : class, IBaseEntity;
IQueryable<T> Get<T>(Expression<Func<T, bool>> predicate = null, Func<IQueryable<T>, IOrderedQueryable<T>> sorter = null, params string[] includeProperties) where T : class, IBaseEntity;
IQueryable<T> GetAll<T>() where T : class, IBaseEntity;
IDbContext GetDbContext();
}
public interface IUnitOfWork : IDisposable
{
int Commit();
bool Delete<T>(T entity) where T : class, IBaseEntity;
int DeleteItems<T>(IList<T> entities) where T : class, IBaseEntity;
bool Insert<T>(T entity) where T : class, IBaseEntity;
int InsertItems<T>(IList<T> entities) where T : class, IBaseEntity;
bool Update<T>(T entity) where T : class, IBaseEntity;
int UpdateItems<T>(IList<T> entities) where T : class, IBaseEntity;
}
Я не уверен, как это должно работать. Должен ли я использовать IDbContextFactory в репозитории для совместного использования DbContext между репозиторием и UnitOfWork или у них должны быть отдельные DbContexts? Если я реализую UnitOfWork для записи и репозитория для чтения, должен ли быть модуль UnitOfWorks DbContext для записи и репозитория DbContext для чтения, или они должны делиться одним и тем же DbContext?
Я бы очень признателен за хорошее объяснение того, как должны работать DbContext и UnitOfWork/Repository.
Те будут реализованы в процессе эксплуатации таким образом:
public CustomerService(IGenericRepository repository)
{
this.repository = repository;
this.context = this.repository.GetDbContext();
}
public void UpdateCustomer(Customer customer)
{
var uow = this.repository.CreateUnitOfWork();
uow.AddForSave(customer);
uow.Commit();
}
public List<Customer> GetAll()
{
return this.repository.GetAll<Customer>();
}
Любая помощь, объяснение о DbContext и UOW/Repository отношения, или хороший учебник, подобной этой реализации поможет.
С уважением.
'UnitOfWork следует использовать для записи, в то время как репозиторий следует использовать для чтения. Я никогда не слышал об этом. – Jonesopolis
Не нужно как« обязано », но рекомендуется для многих обновлений сущностей (один объект может быть обновлен с помощью репозитория) , Хотя есть много отличных шаблонов для использования репозитория для обоих, но я хотел бы придерживаться этого. – zhuber
@Disappointed имеет хорошую ссылку для вас. Но имейте в виду, что шаблоны UoW и Repository очень обсуждаются, некоторые говорят, что они устарели. Конечно, в среде EF/MVC, где DbContext и DbSet уже выполняют большую часть этой функции. –