Общий репозиторий - IRepository <T> или IRepository
Я видел два разных подхода для создания родовых репозиториев. Каковы различия между этими двумя подходами (плюсы и минусы)?
Пожалуйста, обратите внимание на различия в методах, потому что меня интересует разница между
public interface IRepository<T> where T : class
и
public interface IRepository : IDisposable
Есть ли разница в функциональности, гибкости, модульном тестировании...? Что я получу или проиграю?
Есть ли какая-то разница в том, как они зарегистрированы в инфраструктурах Injection Dependency?
Вариант 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
Самое большое различие заключается в том, что IRepository<T>
привязан к одному типу, а IRepository
потенциально связан с несколькими типами. Какой из них подходит, сильно зависит от вашего конкретного сценария.
Вообще говоря, я нахожу IRepository<T>
более полезным. Во время использования предельно ясно, что такое содержимое IRepository<T>
(T
). С другой стороны, из данного IRepository
не видно, что содержится внутри него.
В случаях, когда мне приходится хранить несколько типов объектов, я обычно создаю карту экземпляров IRepository<T>
. Например: Dictionary<T,IRepository<T>>
.