Организационно, где я должен поставить общие запросы при использовании Entity Framework Code First? - PullRequest
23 голосов
/ 30 марта 2011

Я выкладываю новый слой данных, используя код EF 4.1 Сначала, переходя со старого уровня данных доморощенного.

Я настроил две сборки, одну для моего контекста и одну для всего кода POCOпервые занятия

У меня есть некоторая бизнес-логика, например, запрос к одной таблице (или нескольким таблицам), которая используется в нескольких разных местах. Куда мне его поместить?

Он не может входить в класс POCO, потому что он объединяет пару таблиц и поэтому нуждается в контексте.Это может идти в контексте, но этот контекст станет раздутым с сотнями неорганизованных запросов. Существует ли общая схема или схема всей бизнес-логики?

Ответы [ 3 ]

73 голосов
/ 30 марта 2011

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

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

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

4 голосов
/ 30 марта 2011

Я бы использовал Шаблон репозитория.Ниже приведен пример использования кода EF и MVC Entity Framework 4 CTP 4 / CTP 5 Универсальный шаблон репозитория и тестируемый модуль

Вот несколько хороших прочтений по шаблону:

Это также может быть хорошей идеей для изучения доменного дизайна (DDD)поскольку вы начинаете с доменной модели.

Некоторые хорошие чтения в DDD:

2 голосов
/ 23 мая 2011

Если вы используете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...