DDD моделирование, взаимодействие между агрегатными корнями - PullRequest
5 голосов
/ 20 августа 2010

alt text Помечены мои совокупные корни с 1; 2; 3. Выглядит довольно красиво - почти как виноград.

alt text

Мне не нравится объект, отмеченный красной стрелкой.

Давайте представим, что:

  • AR # 1 является компанией
  • AR # 2 - офис
  • AR # 3 является сотрудником
  • Объект, отмеченный красной стрелкой, называется Country
    • Компания устанавливает правила, из каких стран она нанимает сотрудников (при найме company.Countries.Contains(employee.Country) должно быть верно)

Я каким-то образом вижу эту совершенно неважную часть домена (возможно, в этом примере это звучит не так), и я бы хотел не рекомендовать стране объединять root.

Глоссарий о совокупных корнях говорит:

Временные ссылки на внутренние элементы могут быть переданы для использования только в рамках одной операции.

Итак, звучит ли разумно введение чего-то вроде «EmployeeCountry», удаление ссылки на страну компании и проверка соответствия страны сотрудника какой-либо стране компании при найме на работу?

Есть еще идеи?

Как я могу заставить свой виноград выглядеть так, как должен?

1 Ответ

7 голосов
/ 20 августа 2010

В этом контексте Country - это просто объект значения, а не сущность, а тем более сводный корень, поэтому нет никаких причин что-либо менять в своем дизайне (без дополнительной информации).

Кроме того, обратите вниманиечто приведенное вами предупреждение относится к внутренним элементам совокупных корней , а не к самим агрегатам.Нет ничего плохого в сохранении ссылок на агрегаты в нескольких местах.Предполагается, что агрегированные корни инкапсулируют дочерние объекты, так что есть единственное место для принудительного применения бизнес-правил для связанных объектов.

Вы можете ясно видеть это в нескольких местах в «Управляемом доменом проекте» Эванса (он же « Синяя книга").Например, см. Диаграмму на стр. 127 (во введении к агрегатным корням), где показан агрегат Car со ссылкой на агрегат Engine.

...