Совокупный корневой вопрос - PullRequest
2 голосов
/ 20 октября 2010

В одном из моих проектов у меня есть класс 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; 
    }
}

Или я упускаю всю суть совокупных корней? Может ли кто-нибудь рассказать мне несколько примеров о том, какова цель совокупных корней? Как пример, который показывает мне, что может достигнуть агрегированный корень по сравнению с некоторым стандартным подходом Пример из реальной жизни, который показывает, какая именно проблема проектирования решается при использовании совокупного корня.

Спасибо.

1 Ответ

2 голосов
/ 21 октября 2010

Основная цель агрегатных корней - структурировать Ваши объекты и определить явные границы.

На мой взгляд, одно из главных преимуществ заключается в том, что они устраняют сеть ссылок. Состояние всегда будет изменяться через агрегатный корень, за его достоверность отвечает агрегатный корень. Это означает, что на верхних уровнях вам нужно думать, как правильно взаимодействовать только с корнями, и вам не нужно думать о внутренних деталях их.

Это то, для чего должен использоваться агрегированный корень?

Это одна из вещей, за которые AR отвечает - подтверждать себя.

Или я мог бы также сделать адрес агрегированным корнем и сделать его ссылкой на гараж.

Искусственное создание агрегатных корней не очень хорошая идея. Вы должны тщательно подумать, прежде чем продвигать сущность для агрегирования корня. Чем больше у вас корней, тем больше ссылок, похожих на сеть. Если каждая сущность будет корневой - вы вернетесь в реляционную базу данных, когда вам будет нелегко следовать иерархии.

...