Многие учебники по DDD, которые я изучал, в основном охватывают теорию. Все они имеют примеры элементарного кода (Pluralsight и аналогичные).
В Интернете также предпринимаются попытки нескольких людей создать учебники по DDD с EF. Если вы начнете их изучать ненадолго - вы быстро заметите, что они сильно отличаются друг от друга. Некоторые люди рекомендуют держать приложение минимальным и избегать введения дополнительных слоев, например, хранилища поверх EF , другие решительно генерируют дополнительные слои, часто даже нарушая SRP, внедряя DbContext
в Aggregate Roots.
Я ужасно извиняюсь, если задаю основанный на мнении вопрос, но ...
Когда дело доходит до практики - Entity Framework является одним из самых мощных и широко используемых ORM. К сожалению, вы не найдете исчерпывающего курса по DDD.
Важные аспекты:
Entity Framework выводит UoW & Repository (
DbSet
) из коробкис EF ваши модели имеют навигационные свойства
с EF все модели всегда доступны выключены
DbContext
(они представлены какDbSet
)
Ловушки:
Вы не можете гарантировать, что ваши дочерние модели будут затронуты только через Aggregate Root - ваши модели имеют свойства навигации, и их можно изменить и вызвать
dbContext.SaveChanges()
с помощью которого
DbContext
вы можете получить доступ к каждой модели, таким образом обойдя Aggregate Rootвы можете ограничить доступ к дочерним элементам корневого объекта с помощью метода
ModelBuilder
in , пометив их как поля - я до сих пор не верю, что это правильный путь для DDD, плюс трудно оценить, к каким приключениям это может привести в будущем ( довольно скептически )OnModelCreating
конфликты:
без реализации другого уровня репозитория, который возвращает Aggregate, мы не можем даже частично устранить вышеупомянутые ловушки
реализуя дополнительный уровень хранилища, мы игнорируем встроенные функции EF (каждый
DbSet
уже является репо) и усложняем приложение
Мой вывод:
Прошу прощения за мое невежество, но на основании приведенной выше информации - либо Entity Framework не подходит для доменно-управляемого дизайна, либо доменно-управляемый дизайн является несовершенным и устаревшим подходом.
Я подозреваю, что у каждого из подходов есть свои достоинства, но сейчас я совершенно потерян и не имею ни малейшего представления о том, как совместить EF с DDD.
Если я не прав - может кто-нибудь хотя бы подробно описать простой набор инструкций (или даже предоставить приличные примеры кода), как работать с DDD с EF, пожалуйста?