Ответ
Агрегат в Domain-Driven Design (DDD) — это кластер связанных объектов домена, которые можно рассматривать как единое целое. Главная задача агрегата — обеспечивать целостность данных и соблюдение бизнес-правил (инвариантов) внутри своей транзакционной границы.
У каждого агрегата есть Корень Агрегата (Aggregate Root) — это сущность внутри агрегата, которая является единственной точкой входа для всех внешних обращений. Любые изменения в объектах внутри агрегата должны происходить только через методы его корня.
Ключевые принципы:
- Защита инвариантов: Корень агрегата отвечает за то, чтобы любое изменение не нарушало бизнес-правила. Например, нельзя добавить в заказ товар, которого нет на складе.
- Транзакционная целостность: Изменения в агрегате сохраняются атомарно. Либо все изменения внутри него успешны, либо ни одно из них не применяется.
- Ссылки по идентификатору: Внешние объекты могут ссылаться только на корень агрегата. Прямые ссылки на внутренние объекты агрегата запрещены, чтобы не нарушать его целостность.
Пример на Go:
// Order является Корнем Агрегата
type Order struct {
ID uuid.UUID
CustomerID uuid.UUID
Items []OrderItem
Status string
}
// OrderItem - часть агрегата, управляемая через Order
type OrderItem struct {
ProductID uuid.UUID
Price float64
Quantity int
}
// Метод на корне агрегата для добавления элемента.
// Он контролирует соблюдение бизнес-правил.
func (o *Order) AddItem(item OrderItem) error {
if o.Status == "Completed" {
return errors.New("нельзя добавить товар в завершенный заказ")
}
// Другие проверки, например, на максимальное количество товаров
o.Items = append(o.Items, item)
return nil
}