Агрегаты имеют дело только с ИЗМЕНЕНИЕ ДАННЫХ .Не должно быть двух агрегатов для изменения одних и тех же данных.Поскольку объект Value является неизменным, он предотвращает возникновение этого сценария.Поэтому вполне допустимо, чтобы два или более агрегатов совместно использовали один и тот же объект значений, так как это структура данных только для чтения, а агрегат не заботится о модели чтения.
Address a = new Address("1111 ABC Ave.");
person.setAddress(a);
letter.setAddress(a);
person.getAddress().change("2222 XYS Ave.") // THIS IS ILLEGAL SINCE Address is a VO (immutable)
Выше никогда не произойдет дляАдрес, и поэтому не опасно делиться, потому что ничто из того, что вы делаете с адресом человека, никогда не повлияет на письмо, поэтому письмо по-прежнему защищает свои собственные инварианты.
Если Адрес превращен в объект,тогда вы не сможете использовать один и тот же адрес в обеих сущностях, так как приведенный выше код сделает письмо уязвимым для изменений, выполненных над человеком, и это нарушит границу, и это предотвратит контроль письма над его инвариантами.
В этом весь смысл Aggregate Roots, он слишком моделирует вещи, ограничивающие побочные эффекты.Если вы определите очень четкие границы изменений, с кодом будет легче работать, и вы предотвратите потенциальный вредный неожиданный эффект.
Я добавлю еще одну вещь.Как уже упоминалось в другом ответе, вы хотите, чтобы другой ограниченный контекст имел другой тип адреса.Причина этого заключается в том, что детали, которые вам нужны для адреса в одном контексте, не обязательно совпадают с тем, что вам нужно в другом.Таким образом, имея два типа адреса, по одному для каждого контекста, вы изолируете потребности одного от потребностей другого.
Скажем, для доставки вам нужно:
Address
{
Number;
Unit;
Street;
State;
Country;
PostalCode;
}
Но для местоположения выneed:
Address
{
Number;
Unit;
Latitude;
Longitude;
}
DDD скажет, назовите их оба Address, но свяжите их с другим контекстом.Таким образом, даже несмотря на то, что на языке, о котором они все говорят как адрес, их конкретные данные и поведение могут отличаться в зависимости от контекста, о котором вы говорите.То, что вы абсолютно не должны делать, - это создать своего рода MonsterAddres, который будет содержать все возможные данные и поведение всех контекстов в вашем домене и иметь этот тип адреса, используемый во всех контекстах.
Обратите внимание, что мы говоримЧто касается модели в вашем приложении, то все данные адресов можно хранить в таблице адресов Monster, но при моделировании вашего приложения вы должны разделить их на логически ограниченный контекст, который сопоставляется с вашим доменом и вездесущим языком, который он использует.