Багато навчальних посібників з DDD, який я вивчав, здебільшого охоплюють теорію. Всі вони мають рудиментарні приклади коду (Pluralsight та подібні).
В Інтернеті також є спроби кількох людей створити навчальні посібники, що охоплюють DDD за допомогою EF. Якщо ви почнете їх вивчати лише коротко - ви швидко помітите, що вони сильно відрізняються один від одного. Деякі люди рекомендують мінімізувати додаток та уникати введення додаткових шарів, наприклад, сховища поверх EF , інші, безперечно, генерують додаткові шари, часто навіть порушуючи SRP, вводячи DbContext
в агрегатні корені.
Я жахливо вибачаюсь, якщо задаю питання, засновані на думці, але ...
Що стосується практики - Entity Framework - одна з найпотужніших та широко використовуваних ОРМ. На жаль, ви не знайдете комплексного курсу, що охоплює DDD.
Важливі аспекти:
Entity Framework виводить UoW & Repository (
DbSet
) з коробкиз EF ваші моделі мають навігаційні властивості
з EF все моделей завжди доступний офф
DbContext
(вони представлені у виглядіDbSet
)
Підводні камені:
ви не можете гарантувати, що ваші дочірні моделі впливають лише через агрегатний корінь - ваші моделі мають навігаційні властивості, і їх можна змінювати та дзвонити
dbContext.SaveChanges()
з
DbContext
ви можете отримати доступ до кожної вашої моделі, таким чином обходячи агрегатний RootВи можете обмежити доступ до дітей кореневого об'єкта з допомогою
ModelBuilder
вOnModelCreating
методі , позначивши їх як поля - я до сих пір не вірю , що це правильний шлях йти про DDD плюс це важко оцінити , які пригоди це може привести в майбутньому ( вельми скептично )
Конфлікти:
без реалізації іншого шару сховища, який повертає Aggregate, ми навіть частково не можемо вирішити вищезазначені підводні камені
реалізуючи додатковий шар сховища, ми ігноруємо вбудовані функції EF (кожне
DbSet
вже є репо) та надмірно ускладнюємо додаток
Мій висновок:
Пробачте про моє незнання, але виходячи з вищенаведеної інформації - це або Entity Framework не є адекватним для дизайну, керованого доменом, або дизайн, керований доменом, є недосконалим і застарілим підходом.
Я підозрюю, що кожен із підходів має свої достоїнства, але я повністю втрачений зараз і не маю ні найменшого уявлення про те, як узгодити EF з DDD.
Якщо я помиляюся - чи могла б хтось хоча б деталізувати простий набір інструкцій (або навіть надати пристойні приклади коду) про те, як рухатись щодо DDD з EF?