Куда мне с организационной точки зрения помещать общие запросы при использовании Entity Framework Code First?

Нет ничего неправильно со статическим контролем типов при использовании Haskell который имеет невероятную статическую систему типов. Однако, если Вы используете языки как Java и C++, которые имеют ужасно наносящие вред системы типов, утиный ввод является определенно улучшением.

Предполагают пытаться использовать что-то столь же простое как" карта " в Java (и не, я не имею в виду структура данных ). Даже дженерики скорее плохо поддерживаются.

23
задан Ladislav Mrnka 30 March 2011 в 16:22
поделиться

2 ответа

Похоже, что шаблон репозитория является решением для всего ... Репозиторий - это не серебряная пуля!

Я использую шаблон репозитория с 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, часто является бесполезным кодом и просто дополнительным уровнем сложности.

Таким же образом вы можете создавать повторно используемые методы, определяющие ваши запросы.

74
ответ дан 29 November 2019 в 00:46
поделиться

Если вы используете EF непосредственно в бизнес-методах (Службы уровня домена и Службы уровня приложения), то вы не изолируете Уровень модели домена от технологий инфраструктуры (в данном случае EF). Это один из принципов DDD. у вас, вероятно, должен быть один репозиторий на агрегат.

Для получения дополнительной информации о DDD см .:

Книга Эрика Эванса: http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215

Microsoft: http://msdn.microsoft.com/es-es/architecture/en

2
ответ дан 29 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: