Немного запутанных вещей о фабриках в DDD
a) Я немного озадачен тем, что в большинстве случаев мы должны иметь только factory, который создает весь агрегат, или у нас также есть factory, который создает только корень агрегата?
b) Если factory, который строит весь агрегат, строит как корневые, так и не-корневые объекты сам по себе, или должен ли он делегировать создание не-root-сущностей/VO на другие фабрики?
Таким образом, если Aggregate содержит 5 разных типов объектов, отличных от root, необходимо, чтобы Aggregate factory создавал эти объекты без полномочий root, или у нас есть дополнительные пять фабрик (один factory для каждого не-корневого объекта) к которой Aggregate factory делегирует создание определенного типа не-корневой сущности?
Спасибо
Ответы
Ответ 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);
}
}`