Подтвердить что ты не робот

Организационно, где я должен ставить общие запросы при первом использовании кода Entity Framework?

Я выкладываю новый слой данных, используя EF 4.1 Code First, переносясь с более старого слоя данных homebrew.

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

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

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

4b9b3361

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

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

Ответ 2

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

Вот некоторые хорошие чтения по шаблону:

Также может быть хорошей идеей изучить Domain Driven Design (DDD), поскольку вы начинаете с модели домена.

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

Ответ 3

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

Подробнее о DDD см. ниже:

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

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