@BloodyBlade

Правильно ли реализованы паттерны «Сессия» и «Репозиторий»?

Здравствуйте. В течении некоторого времени я реализовывал паттерн"Репозиторий" по примеру из книги Сандерсона "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();
      }
    }


В итоге какие я вижу плюсы и минусы:
Плюсы:
- нет необходимости для каждой сущности писать свой репозиторий;
- можно выполнить несколько действий в рамках одного запроса к БД;
- нет постоянного соединения с базой данных.
Минусы:
- нельзя использовать внедрение зависимостей через конструктор;
- если для сущности потребуются какие-то специфифческие действия, для нее все равно придется создавать отдельный репозиторий;
- дополнительные накладные расходы на переподключение к БД и создание репозитория.
Интересно услышать ваше мнение, верно ли использовать подобную реализацию? Или есть какие-либо фатальные недостатки?
  • Вопрос задан
  • 552 просмотра
Решения вопроса 1
andrewpianykh
@andrewpianykh
На мой взгляд использование данных паттернов для EF излишне.


A DbContext instance represents a combination of the Unit Of Work and Repository patterns such that it can be used to query from a database and group together changes that will then be written back to the store as a unit.

msdn.microsoft.com
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы