После большого количества чтения и тестирования с Entity Framework
последней стабильной версией (6.1.1).
Я читаю много противоречий о том, следует ли использовать репозитории с EF6
или EF
вообще, потому что он DbContext
уже предоставляет репозиторий и DbSet
UoW
, из коробки.
Позвольте мне сначала объяснить, что мое решение содержит в терминах проекта, и затем я вернусь к противоречию.
Он имеет проект библиотеки классов и проект asp.net-mvc
. Проект класса lib, являющийся доступом к данным, и где Migrations
включены для Code First
.
В моем проекте класса lib у меня есть общий репозиторий:
public interface IRepository<TEntity> where TEntity : class
{
IEnumerable<TEntity> Get();
TEntity GetByID(object id);
void Insert(TEntity entity);
void Delete(object id);
void Update(TEntity entityToUpdate);
}
И вот его реализация:
public class Repository<TEntity> where TEntity : class
{
internal ApplicationDbContext context;
internal DbSet<TEntity> dbSet;
public Repository(ApplicationDbContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get()
{
IQueryable<TEntity> query = dbSet;
return query.ToList();
}
public virtual TEntity GetByID(object id)
{
return dbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = dbSet.Find(id);
Delete(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
И вот несколько объектов:
public DbSet<User> User{ get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<UserOrder> UserOrders { get; set; }
public DbSet<Shipment> Shipments { get; set; }
Я не повторяю, но с EF6
вы больше не пропускаете репозитории, а DbContext
. Итак, для DI
я создал в проекте asp-net-mvc
следующее: Ninject
:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
}
И это будет вставлять ApplicationDbContext
через инъекцию конструктора в классы верхнего уровня, где это применимо.
Теперь вернемся к противоречию.
Если нам больше не нужен репозиторий, потому что EF
уже предоставляет это из коробки, как мы это делаем Separation of Concern
(сокращенно называемый SoC в заголовке)?
Теперь исправьте меня, если я ошибаюсь, но это звучит для меня так, как будто мне просто нужно сделать все логику/вычисления доступа к данным (например, добавление, выборку, обновление, удаление и некоторые пользовательские логики/вычисления здесь и там (объект specific)) в проекте asp.net-mvc
, если я не добавляю репозиторий.
Любой свет по этому вопросу действительно оценен.