Мы вначале пытаемся принять проект, управляемый доменом, в нашем проекте. Проблема у меня связана с ассоциациями между сущностями. Как вы их делаете правильно?Правильный способ реализации ассоциаций в DDD?
Скажите, у меня есть объекты Employee
и Contract
, простая ассоциация «один-ко-многим». Как мне его моделировать?
Вариант 1: Совокупный.
Проблема: Проблема в том, что если я правильно ее понимаю, все объекты в агрегате должны загружаться при создании агрегатного объекта. Я не могу лениво загружать объекты, когда они нужны, потому что для этого потребуется привязка репозитория от объекта, который, по-видимому, плох. Но выбор всех контрактов сотрудника из базы данных каждый раз был бы большой проблемой производительности.
Вариант 2: Получение контрактов работника, используя хранилище (например, ContractRepository.GetContractsForEmployee()
) и добавление EmployeeId
свойства Contract
класса.
Задача: трудно сделать любую бизнес-логику сущностью. Я хотел бы иметь метод, скажем, Employee.Dismiss()
, но ему также необходимо будет обновить контракт сотрудника. Это означает, что мне нужно будет поставить эту логику в службу. Проблема в том, что я не могу придумать много логики, работающей только на Employee
, и, таким образом, модель станет несколько анемичной, с большинством логических внутренних сервисов.
Как вы справляетесь с этими проблемами в DDD?
Как только вы думаете о «простой ассоциации один-ко-многим», вы не используете DDD, вы создаете схему схемы базы данных. Связь между сущностями должна быть поведением. Работник не может уволить себя, он должен быть уволен (другим органом, который имеет право сделать это). Вариант 2 является правильным. Вам не нужно придумывать много действий для Entity. Если объект домена очень прост в реальном бизнесе, моделируйте его таким образом. Это важно, как домен определяет концепцию (семантику), а не то, сколько методов имеет объект. – MikeSW
MikeSW правильный. Очень важным аспектом DDD является вездесущий язык. То, как вы говорите о домене, ДОЛЖНО быть тем, как эксперт домена говорит о Домене, иначе код становится неудобным и неинтуитивным. Это звучит тривиально, но если вы получите это право, то Entities начнут предлагать поведение. например Employee.Resign(); Contract.Terminate(); – Asher