a) 我有点困惑,在大多数情况下,我们是否应该只有一个生产整个聚合的工厂,还是我们也应该有一个只创建聚合根的工厂?
b) 构建整个聚合的工厂应该自己构建根对象和非根对象,还是应该将非根实体/VO 的构建委托给其他工厂?
因此,如果Aggregate包含 5 种不同类型的非根实体,那么Aggregate 工厂应该自己创建这些非根实体,还是应该有另外五个工厂(每个非根实体一个工厂),Aggregate 工厂将委托给它们创建特定类型的非根实体?
谢谢
a) 我有点困惑,在大多数情况下,我们是否应该只有一个生产整个聚合的工厂,还是我们也应该有一个只创建聚合根的工厂?
b) 构建整个聚合的工厂应该自己构建根对象和非根对象,还是应该将非根实体/VO 的构建委托给其他工厂?
因此,如果Aggregate包含 5 种不同类型的非根实体,那么Aggregate 工厂应该自己创建这些非根实体,还是应该有另外五个工厂(每个非根实体一个工厂),Aggregate 工厂将委托给它们创建特定类型的非根实体?
谢谢
在 Eric Evans 的 DDD 书中,第 138 页,它用粗体写成:
将整个聚合创建为一个整体,强制执行它们的不变量。
然后在下一页:
FACTORY 应该只能生产处于一致状态的对象。对于一个实体,这意味着创建整个聚合 [...]
具体来说,这意味着您将只有一个工厂来创建整个聚合。构建非根实体或值对象可能涉及其他类(工厂),但只有一个工厂负责创建聚合。这个工厂创建了一个完整的聚合,而不仅仅是一个根对象。
子根对象(例如OrderItem
for an Order
)的创建由根实体本身处理,因此它可以以对外界不可见的方式强制执行变体。
所以一个典型的流程可能是:
var newOrder = orderFactory.CreateOrder(customer);
newOrder.AddOrderItem(product, quantity);
工厂可以在实体中使用,但不应被外界访问。
public class Order
{
private OrderItemFactory _orderItemFactory;
public AddOrderItem(Product product, int Quantity)
{
var newOrderItem = _orderItemFactory.CreateOrderItem(product, quantity);
}
}`