Я думаю о дизайне довольно простой задачи, но мне бы хотелось услышать другие решения, чтобы справиться с ней должным образом.
На данный момент у меня есть 2 совокупных корня:
User
: содержит информацию о пользователе, например display name
, linked accounts
и profile
, которые могутбыть patient profile
или care provider profile
.Такой профиль пациента содержит информацию, такую как birth date
и gender
.У меня есть UserRepository
, который заботится о получении и спасении пользователей. Screening
: содержит информацию о состоянии здоровья, такую как измерения длины и веса, а также все виды вычисляемой информации, такие как «краткосрочная эволюция»,основанный на этих длинах и весах. У меня есть ScreeningRepository
, который заботится о получении и сохранении пользователей.
Таким образом, есть Calculate()
метод в Screening
, и цель состоит в том, чтобы когдаweight
и / или length
добавляется к screening
, свойства работоспособности, такие как short term evolution
, пересчитываются немедленно, так что screening
всегда находится в согласованном и правильном состоянии.
Проблема в том, что для этого вычисления также нужны gender
и birth date
пользователя, которые хранятся в patient profile
.
. Таким образом, в основном, корень агрегата screening
зависит от корня агрегатаuser
. Так что мне интересно, как это сделать ...
Согласно DDD, объединенный корень не должен ссылаться на другой объединенный корень. А также, если бы я сделалuser
Имущество screening
, тон ScreeningRepository
также будет отвечать за дематериализацию пользователя, что, конечно, не является его задачей.
Если screening
не имеет ссылки на user
, то Calculate()
не имеет всей необходимой информации.Таким образом, это означает, что я, вероятно, должен переместить его в доменную службу, которая получает user
и screening
в качестве входных данных, и выполнить расчет.Хорошо.Но тогда как я могу быть уверен, что при добавлении измерения к проверке срабатывает Calculate
?
Другой вариант, о котором я думал, это не делать screening
агрегатный корень, и сделайте его просто агрегатом с родительским user
.Это также позволяет мне лучше проверить screening
, потому что я также могу получить доступ к User
.Это решило бы все вопросы о вычислениях, потому что у меня была бы вся информация под рукой, но таким образом, UserRepository
будет отвечать также за обработку screening
, и мой совокупный корень становится ответственным за users
и screenings
,
На данный момент последний вариант, кажется, единственный, который облегчает решение проблемы, но я хотел бы услышать любые мысли о вещах, поскольку я могу упустить очевидные понятия.