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