В одном из моих проектов у меня есть класс Garage.
Этот класс содержит множество коллекций, таких как адреса, банковские счета, членство и т. Д.
Все эти классы коллекции имеют действительность. Это означает, что адрес может быть действительным в течение периода времени, указанного пользователем. Можно добавить новые адреса или банковские счета, но срок действия не может перекрывать срок действия другой записи.
Итак, я сделал класс Garage совокупным корнем. Адреса и т.д. могут быть добавлены с помощью методов. Каждый раз, когда добавляется запись, я проверяю, перекрывает ли добавляемая запись другой период действия, который уже находится в коллекции.
Вот так:
protected internal void AddAddress(Address address)
{
Check.Require(new IsUniqueValiditySpecification<Address>(
this.addresses.ToList()).IsSatisfiedBy(address),
"The validity period intersects with the one of an existing address");
...
}
Это то, для чего должен использоваться агрегированный корень? Или я мог бы также сделать адрес совокупным корнем и сделать его ссылкой на гараж. Затем каждый раз, когда устанавливается допустимость, я могу сделать что-то вроде:
public virtual Validity Validity
{
get { return validity; }
set {
Check.Require(new IsUniqueValiditySpecification<Address>(
this.garage.Addresses.ToList()).IsSatisfiedBy(this),
"The validity period intersects with the one of an existing address");
validity = value;
}
}
Или я упускаю всю суть совокупных корней? Может ли кто-нибудь рассказать мне несколько примеров о том, какова цель совокупных корней? Как пример, который показывает мне, что может достигнуть агрегированный корень по сравнению с некоторым стандартным подходом Пример из реальной жизни, который показывает, какая именно проблема проектирования решается при использовании совокупного корня.
Спасибо.