Подтвердить что ты не робот

Немного запутанных вещей о фабриках в DDD

a) Я немного озадачен тем, что в большинстве случаев мы должны иметь только factory, который создает весь агрегат, или у нас также есть factory, который создает только корень агрегата?

b) Если factory, который строит весь агрегат, строит как корневые, так и не-корневые объекты сам по себе, или должен ли он делегировать создание не-root-сущностей/VO на другие фабрики?

Таким образом, если Aggregate содержит 5 разных типов объектов, отличных от root, необходимо, чтобы Aggregate factory создавал эти объекты без полномочий root, или у нас есть дополнительные пять фабрик (один factory для каждого не-корневого объекта) к которой Aggregate factory делегирует создание определенного типа не-корневой сущности?

Спасибо

4b9b3361

Ответ 1

В книге DDD Эрика Эванса на стр. 138 она выделена жирным шрифтом:

Создайте целые агрегаты как часть, применяя их инварианты.

Затем на следующей странице:

A FACTORY должен только иметь возможность создавать объект в последовательном государство. Для ENTITY это означает создание всего AGGREGATE [...]

Конкретно это означает, что для создания всего агрегата вам будет только один FACTORY. Могут существовать другие классы (фабрики), участвующие в создании ваших не-корневых объектов или объектов значений, но для создания агрегата отвечает только один FACTORY. Этот FACTORY создает полный агрегат, а не только корневой объект.

Ответ 2

Создание суб-корневых объектов (например, OrderItem для Order) обрабатывается самой корневой сущностью, поэтому оно может применять варианты как невидимые для внешнего мира.

Таким образом, типичный поток может быть:

var newOrder = orderFactory.CreateOrder(customer);

newOrder.AddOrderItem(product, quantity);

A factory может использоваться внутри объекта, но к нему не должен обращаться внешний мир.

public class Order
{
     private OrderItemFactory _orderItemFactory;

     public AddOrderItem(Product product, int Quantity)
     {
          var newOrderItem = _orderItemFactory.CreateOrderItem(product, quantity);
     }
}`