Чтобы отличить, является ли адрес ценным объектом или сущностью, задайте себе вопрос - если адрес человека изменится, а у второго человека будет один и тот же адрес - изменится ли оба?Если они оба меняются - адрес повышается до сущности (причина в том, что идентичность адреса важна, а не имеет значение).
Чтобы отличить, является ли адрес сущностью или совокупным корнем, задайте себе вопрос - имеет ли адрес какой-то смыслсобственный или всегда привязанный к человеку, модифицируется через него, удаляется вместе с ним?Если он не связан с человеком, но существует сам по себе (в модели, которую вы моделируете, а не в реальности), тогда адрес является агрегированным корнем.
Строго говоря, этот агрегированный корень не нужен,но если у меня его нет, мне придется пройти через многие объекты, чтобы получить полный адрес.Имеет ли смысл создавать агрегированный корень на основе этого аргумента?
Нет, это не так.Технические проблемы не должны связываться с Вашим доменом.Субъект может работать как «субагрегат», адрес может объединять муниципалитет, город и т. Д. И при этом оставаться просто сущностью (потому что это не имеет смысла без человека).
Человекв этом случае никогда не будет ссылаться на что-либо, кроме сводного корня, однако пользовательский интерфейс может отображать только муниципалитеты (при просмотре адресов и т. д.).Является ли это нарушением общей идеи корня?
Презентация также не должна портить Ваш домен.Насколько я вижу - это прекрасно, если вы показываете только список сущностей и скрываете агрегаты, к которым они принадлежат.
Два человека могут быть связаны с одним и тем же адресом, и если один изони перемещаются, другой не перемещается автоматически.
Вопрос в том, как вы хотите смоделировать этот процесс перемещения?
Я вижу 2 способа:
- Когда человек # 1 перемещается, адрес изменяется , но адрес человека # 2 не является тем же адресом и, следовательно, - не затрагивается.В этом случае - адрес просто сущность.
- Когда человек # 1 перемещается, процесс перемещения переключает адрес на другой.В этом случае - адрес является агрегированным корнем.
Адреса существуют самостоятельно, и если человек переходит на адрес, он связывается с ним.
Это означает, что Вы хотите придерживаться 2-го пути (когда адрес является совокупным корнем).Это нормально, и в этом нет ничего плохого, но вам следует еще раз проверить, можно ли перевести адрес в соответствие с сущностью, что сделает вашу модель домена менее сложной.
И имейте в виду - нет "Модель ", есть только" Модель ".Вы не можете смоделировать реальность так, чтобы она идеально имитировалась. Вы можете смоделировать лишь часть ее, чтобы решить конкретные проблемы .
Вот почему так сложно отвечать на вопросы, связанные с DDD.
Никто не знает Ваши проблемы, которые вы пытаетесь решить.
Если я правильно понимаю (http://msdn.microsoft.com/en-us/magazine/dd419654.aspx - часть об агрегатах), то может ли адрес существовать безчеловек (или другой адресат) не имеет значения;вопрос в том, могут ли составные части адреса существовать или быть доступными без адреса.Если они могут, Адрес не должен быть объединенным корнем.
Это актуально.Если адрес не может существовать без человека (что здесь не так) - он неизбежно понижается в качестве сущности (потому что без человека это не имеет смысла) или объекта значения (если сам адрес не имеет идентичности).В противном случае - вы просто вводите ненужный агрегатный корень.
Хорошо, если агрегатный корень содержит ссылки на другие агрегатные корни (но не сущности других агрегатных корней).Следовательно, составляющие адреса также могут быть агрегированными корнями (муниципалитет, на который ссылается PostOffice), и это не изменится, если сам адрес является сущностью или агрегированным корнем.