Я отвечаю на ваш вопрос, исходя из предположения, что вы используете Entity Framework непосредственно в своем пользовательском интерфейсе / контроллере / сервисах.
Было доказано, что использование любого ORM, включая EF, непосредственно в вашем UI / Controllers / Services вызовет много проблем в будущем. Кроме того, это затрудняет, если не невозможно, модульное тестирование вашего приложения.
Второй подход, т. Е. «Модель реализует репозиторий», на мой взгляд, также неверен, поскольку Модель и Репозитории имеют разную ответственность, и, основываясь на части «СОЛНЕЧНАЯ ОТВЕТСТВЕННОСТЬ» принципов SOLID, не следует объединять две концепции. Даже если вы хотите использовать шаблон Active Objects в своей модели, который я не рекомендую, вы должны отделить свою модель от используемой ORM.
Лучшее и наиболее рекомендуемое решение - иметь интерфейс, такой как IRepository или IRepository, с очень простыми элементами, как предлагает шаблон. что-то вроде:
Interface IRepository<T> where T:class
{
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
// if you don't want to return IQueryable
T FindById(object id);
IEnumerable FindXXXXX(params)
// if you prefer to return an IQueryable
IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}
Обратите внимание, что некоторые репозитории людей не должны возвращать IQueryable. Кроме того, вы можете использовать ISpecification вместо выражений и лямбда-выражений.
вам потребуется реализовать интерфейс IRepositoy для большинства ваших объектов. Используя этот подход, вы также можете высмеивать ваши репозитории при написании модульных тестов. В производственной среде вам нужно будет использовать поставщика Ioc, такого как Unity, Ninject, Linfu, Catsle и т. Д., Вы также можете воспользоваться реализацией общего локатора служб microsoft, чтобы избежать подключения к конкретной инфраструктуре IoC.
В прежние времена у меня был интерфейс доступа к данным, который был реализован для конкретной бизнес-области или службы. Одна из проблем, связанных с этим подходом, заключается в том, что в результате вы получите дублирующий код в разных службах доступа к данным, если будете отслеживать исходный код и в конечном итоге это сделаете.