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

Архитектура Entity Framework 6 База данных - первая и луковая архитектура

Я использую сначала базу данных Entity Framework 6. Я преобразовываю проект для реализации архитектуры лука, чтобы двигаться к лучшему разделению проблем. Я прочитал много статей и просмотрел много видеороликов, но некоторые проблемы решали в моей структуре решения.

У меня есть 4 проекта: Core, Infrastructure, Web и Tests.

Из того, что я узнал, файл .edmx должен быть помещен в мою папку "Инфраструктура". Тем не менее, я также прочитал об использовании шаблонов Repository и Unit of Work для помощи в развязывании EF и использовании Injection Dependency.

С этим сказано:

  • Должен ли я создавать интерфейсы репозитория в CORE для всех объектов в моей модели? Если да, то как бы сохранить это в огромной базе данных? Я заглянул в automapper, но обнаружил проблемы с его представлением IEnumererables vs. IQueryables, но есть расширение, доступное ему для этого. Я могу попробовать этот маршрут глубже, но хочу сначала услышать.

  • Как альтернатива, должен ли я оставить edmx в Infrastructure и перенести файлы .tt T4 для моих объектов в CORE? Имеет ли это какое-либо плотное соединение или хорошее решение?

  • Будет ли общий интерфейс репозитория работать с предложением, которое вы предоставляете? Или, может быть, EF6 уже решает проблему с репозиторием и UoW?

Благодарим вас за рассмотрение моего вопроса и просьба представить любые альтернативные ответы.

Я нашел подобный пост здесь, на который не ответил: EF6 и архитектура Onion - база данных сначала и без шаблона репозитория

4b9b3361

Ответ 1

Сначала база данных не полностью исключает архитектуру лука (например, порты и адаптеры или гексагональную архитектуру, поэтому, если вы видите ссылки на те, что они одинаковые), но это, безусловно, сложнее. Архитектура лука и разделение проблем, которые он отлично вписывает в дизайн с доменным дизайном (я думаю, вы уже упомянули в twitter, что вы уже видели некоторые из моих видео на эту тему на Pluralsight).

Вам следует избегать размещения EDMX в проектах Core или Web. Для этого необходима инфраструктура. В этот момент, сначала с базой данных, у вас будут объекты EF в инфраструктуре. Однако вы хотите, чтобы ваши бизнес-объекты/объекты домена жили в Core. В этом случае у вас есть два варианта, если вы хотите продолжить этот путь:

1) Сначала переключитесь с базы данных на первый код (возможно, с помощью инструмента), чтобы вы могли иметь объекты POCO в Core.

2) Создавайте карту взад и вперед между объектами инфраструктуры и вашими объектами Core, возможно, используя что-то вроде AutoMapper. До того, как EF поддерживал объекты POCO, это был подход, который я использовал при его использовании, и я бы написал репозитории, которые обрабатывали только объекты Core, но внутренне отображались для объектов, специфичных для EF.

Что касается ваших вопросов о репозиториях и единицах работы, об этом уже много написано, о SO и в других местах. Разумеется, вы можете использовать общую репозиториальную реализацию, чтобы упростить доступ к CRUD большому набору сущностей, и похоже, что это может быть быстрым способом продвижения вперед в вашем сценарии. Тем не менее, моя общая рекомендация заключается в том, чтобы избежать создания общих хранилищ в качестве ваших доступных средств доступа к вашим бизнес-объектам и вместо этого использовать агрегаты (см. DDD или мой курс DDD с Джули Лерман на Pluralsight) с одним конкретным хранилищем для каждого сводного корня. Вы также можете отделить сложные бизнес-объекты от операций CRUD и следовать только по методу "Агрегат", где это оправдано. Преимущество, которое вы получаете от этого подхода, состоит в том, что вы ограничиваете доступ к объектам и получаете аналогичные преимущества для фасада над вашим (большим) набором объектов базы данных.

Не чувствуйте, что у вас может быть только один dbcontext для каждого приложения. Похоже, вы меняете этот дизайн с течением времени, а не начинаете с применения зеленого поля. С этой целью вы можете сохранить ваш .edmx файл и, возможно, общий репозиторий для целей CRUD, но затем создать новый код первого dbcontext для определенного набора операций, которые гарантируют сущности POCO, разделение проблем, повышение тестовой способности и т.д. Со временем, вы можете перенести основную часть основного кода, чтобы использовать это, сохраняя при этом существующий dbcontext, чтобы не потерять и использовать текущие функции.

Ответ 2

Я использую сущность framework 6.1 в моем проекте DDD. Код сначала очень хорошо работает, если вы хотите сделать Onion Architecture.

В моем проекте мы полностью изолировали репозиторий от модели домена. Служба приложений - это то, что использует репозиторий для загрузки агрегатов и сохранения агрегатов в базу данных. Следовательно, в домене (ядре) нет интерфейсов репозитория.

Второй вариант использования T4 для генерации POCO в отдельной сборке - хорошая идея. Помните, что ваша модель домена (ядро) должна быть ненадежной.

Хотя общий репозиторий хорош для обеспечения выполнения операций на уровне агрегатов, я предпочитаю использовать конкретный репозиторий больше, просто потому, что не каждому агрегату нужны все generic хранилища.

http://codingcraft.wordpress.com/