Ответ 1
Похоже, что шаблон репозитория - это решение для всего... Репозиторий не является серебряной пулей!
Я использую шаблон репозитория с EF каждый день, потому что, когда я начал свой текущий проект несколько месяцев назад, он выглядел как рекомендуемое решение. Мои выводы:
- Репозиторий делает взаимодействие с EF намного сложнее. Просто просмотрите вопросы, связанные с тегами EF, и вы увидите, какие сложности нужно обрабатывать непосредственно в контексте, changetracker и т.д.
- Общий репозиторий - это то, что работает для операций CRUD, но не для реальных сценариев DDD. Как только ваш репозиторий работает с общим подходом с использованием обобщенных корней (DDD), сбой не выполняется.
- Тестирование модулей не работает вообще, потому что общая идея о том, что вы будете издеваться над репозиторием и протестировать свой верхний уровень без зависимостей с EF и базой данных, будет сработана после того, как вы откроете
IQueryable
. Linq-to-entity - это только подмножество Linq-to-objects, и mock не обрабатывает ссылочную целостность так много раз, что я видел зеленые модульные тесты и исключения времени выполнения. Правильный подход к тестированию с EF - это интеграционные тесты. Mocking репозиторий предназначен только для тестирования реальной бизнес-логики, не связанной с доступом к данным. Если у вас нет интеграционного теста для вашего бизнес-метода, доступа или сохранения данных, вы его не тестировали. - Предоставление специализированных методов, таких как GetByXXX, - это просто шаг назад. Большинство из этих методов используются только один раз. Вы закончите с кодом, похожим на репозитории, используемые для обертывания вызовов хранимых процедур. Многие разработчики любят ORM только потому, что могут избежать такой жесткой архитектуры.
сам EF уже предлагает шаблон репозитория - DbSet
и ObjectSet
являются репозиториями и DbContext
и ObjectContext
являются Единицами работ. Поэтому, на мой взгляд, шаблон репозитория чрезмерно используется. Это может быть полезно в крупных проектах, где вам нужно строгое расслоение или в случае добавления дополнительной логики к его методам. Использование репозитория только потому, что вы хотите обернуть доступ к EF, часто является бесполезным кодом и просто дополнительным уровнем сложности.
Вы также можете создавать методы повторного использования, определяющие ваши запросы.