Здравствуйте. В течении некоторого времени я реализовывал паттерн"Репозиторий" по примеру из книги Сандерсона "ASP.NET MVC Framework с примерами на C# для профессионалов", однако недавно пришел к мысли о его неэффективности, основными недостатками я считаю:
- необходимость писать для каждого типа сущности свой репозиторий с практически идентичным кодом;
- сохранение контекста базы данных после каждого действия, как следствие - большое количество обращение к БД.
Прочитав статьи про проектирование сессий и репозиториев я написал следующую реализацию (часть кода выкинул для большей наглядности):
public class Session : IDisposable
{
private readonly DatabaseContext context = new DatabaseContext();
public Repository<T> Repository<T>() where T : EntityBase, new()
{
return new Repository<T>(context);
}
public void Commit()
{
context.SaveChanges();
}
public void Dispose()
{
if (this.context != null)
this.context.Dispose();
}
}
public class Repository<TEntity> where TEntity : EntityBase, new()
{
private readonly DbSet<TEntity> entities;
public TEntity Create()
{
var entity = new TEntity();
this.Add(entity);
return entity;
}
public TEntity Get(int entityId)
{
return this.entities.Find(entityId);
}
public IEnumerable<TEntity> GetAll()
{
return this.entities.AsEnumerable();
}
public void Add(TEntity entity)
{
this.entities.Add(entity);
}
public void Delete(int entityId)
{
var deletedEntity = this.entities.Find(entityId);
if (deletedEntity != null)
this.entities.Remove(deletedEntity);
}
public Repository(DbContext context)
{
this.entities = context.Set<TEntity>();
}
}
Использую сессию следующим образом:
protected void SaveEntity<TEntity>(TEntity entity) where TEntity : EntityBase, new()
{
using (var session = new Session())
{
session.Repository<TEntity>().AddOrUpdate(entity);
session.Commit();
}
}
В итоге какие я вижу плюсы и минусы:
Плюсы:
- нет необходимости для каждой сущности писать свой репозиторий;
- можно выполнить несколько действий в рамках одного запроса к БД;
- нет постоянного соединения с базой данных.
Минусы:
- нельзя использовать внедрение зависимостей через конструктор;
- если для сущности потребуются какие-то специфифческие действия, для нее все равно придется создавать отдельный репозиторий;
- дополнительные накладные расходы на переподключение к БД и создание репозитория.
Интересно услышать ваше мнение, верно ли использовать подобную реализацию? Или есть какие-либо фатальные недостатки?