Универсальный репозиторий - IRepository <T>или IRepository - PullRequest
32 голосов
/ 05 декабря 2009

Я видел два разных подхода к созданию универсальных репозиториев. Каковы различия между этими двумя подходами (плюсы и минусы)? Пожалуйста, обратите внимание на разницу в методах, потому что меня интересует разница между

 public interface IRepository<T> where T : class

и

 public interface IRepository : IDisposable

Есть ли разница в функциональности, гибкости, модульном тестировании ...? Что я получу или потеряю?
Есть ли разница, как они регистрируются в структурах внедрения зависимостей?

Вариант 1

 public interface IRepository<T> where T : class
 {
       T Get(object id);
       void Attach(T entity);
       IQueryable<T> GetAll();
       void Insert(T entity);
       void Delete(T entity);
       void SubmitChanges();
 }

Вариант 2

 public interface IRepository : IDisposable
    {
        IQueryable<T> GetAll<T>();
        void Delete<T>(T entity);
        void Add<T>(T entity);
        void SaveChanges();
        bool IsDisposed();
    }

1 Ответ

27 голосов
/ 05 декабря 2009

Самое большое отличие состоит в том, что IRepository<T> связан с одним типом, а IRepository потенциально связан с несколькими типами. Какой из них подходит, сильно зависит от вашего конкретного сценария.

Вообще говоря, я считаю IRepository<T> более полезным. Во время использования предельно ясно, каково содержание IRepository<T> (T). С другой стороны, из данного IRepository не ясно, что содержится внутри него.

В случаях, когда мне нужно хранить несколько типов объектов, я обычно создаю карту из IRepository<T> экземпляров. Например: Dictionary<T,IRepository<T>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...