Агрегаты относятся только к ДАННЫЕ МОДИФИКАЦИЯ. Никакой два агрегата не должны позволять изменять одни и те же данные. Поскольку объект Value неизменен, он предотвращает этот сценарий. Поэтому для двух или более агрегатов вполне справедливо использовать один и тот же объект 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)
выше никогда не будет адреса, и поэтому это не опасно делиться, потому что вы ничего сделать, чтобы адрес лица, никогда не будет иметь влияние на письма, поэтому письмо по-прежнему защищать свои собственные инварианты.
Если адрес выполнен в сущности, то вы не сможете использовать один и тот же адрес в обоих сущностях, поскольку вышеуказанный код сделает письмо уязвимым для изменений, выполненных на человека, и это приведет к поломке границы и это препятствовало бы тому, чтобы письмо контролировало его инварианты.
В этом весь смысл сводных корней, это слишком модельные вещи таким образом, чтобы ограничить побочные эффекты. Если вы определяете очень четкие границы модификации, с этим будет легче работать, и вы предотвратите потенциально опасное неожиданное воздействие.
Я добавлю еще одну вещь. Как уже упоминалось в другом ответе, вы хотите, чтобы другой ограниченный контекст имел другой тип адреса. Причина этого в том, что детали, которые вам нужны для адреса в одном контексте, не обязательно совпадают с тем, что вам нужно в другом. Таким образом, имея два типа адреса, по одному для каждого контекста, вы выделяете потребности одного из потребностей другого.
Say для доставки вам нужно:
Address
{
Number;
Unit;
Street;
State;
Country;
PostalCode;
}
Но место вам нужно:
Address
{
Number;
Unit;
Latitude;
Longitude;
}
DDD будет говорить, называть их как адрес, но связал их в другой контекст. Поэтому, хотя на языке все они говорят как о адресе, их конкретные данные и поведение могут отличаться в зависимости от контекста, о котором вы говорите. То, что вы абсолютно не должны делать, это создать своего рода MonsterAddres, который будет содержать все возможные данные и поведение всех контекстов в вашем домене и иметь это тип адреса, используемый во всех контекстах.
Обратите внимание, что мы говорим о модели в вашем приложении, это нормально хранить все данные адресов в таблице адресов Monster, но при моделировании вашего приложения вы должны разделить это на логический ограниченный контекст, который отображается в вашем домене и вездесущий язык, который он использует.
Не могли бы вы привести пример как ограниченного, так и неограниченного контекста? Для лучшего понимания. – madcyree
Если у вас ограниченный контекст заказа и ограниченный контекст клиента, вы хотите иметь независимые адреса. Клиенты и заказ AR находятся в разных контекстах. Если у вас есть рекламные AR-файлы для заказа и доставки, они находятся в одном контексте, и вы можете использовать один и тот же объект значения адреса. –
Спасибо за объяснение :) – madcyree