Допустим, мы продаем автомобили, настраиваемые автомобили.
Клиент выбирает CarModel
и затем начинает настройку CarModel
. В нашем магазине она может выбрать только цвет Steeringwheel
. Некоторые модели автомобилей могут иметь больше типов рулевых колес, чем другие.
Поэтому у нас есть Catalog
, который содержит CarModels
и SteeringWheels
.
Клиент может создать CarConfiguration
. Она выбирает модель, а затем из доступных для этой модели рулевых колес выбирает цветное рулевое колесо, которое ей нравится. всегда присутствовать в каталоге. Для реализации этого инварианта мы должны защитить (как минимум) два метода:
AddSteeringWheel
на CarModel
; мы можем добавить SteeringWheel
, только если он доступен в Catalog
RemoveSteeringWheel
в Catalog
; мы можем удалить SteeringWheel
, только если он не настроен ни на одном CarModel
.
Как применить этот инвариант? CarModel не знает о коллекции SteeringWheel в Каталоге, а каталог также ничего не знает о рулевых колесах CarModel.
Мы могли бы ввести доменную службу и внедрить в нее репозитории. Эта служба сможет получить доступ к данным из обоих агрегатов и сможет применять инварианты.
Другие варианты - создание свойств навигации и настройка ORM (в моем случае Entity Framework Core) для явной загрузки этих отношений. .
И, возможно, еще много, о чем я сейчас не могу вспомнить ...
Каковы самые изящные / pure-ddd / лучшие практики для достижения этой цели?