12

a) 我有点困惑,在大多数情况下,我们是否应该只有一个生产整个聚合的工厂,还是我们也应该有一个只创建聚合根的工厂?

b) 构建整个聚合的工厂应该自己构建对象和非根对象,还是应该将非根实体/VO 的构建委托给其他工厂?

因此,如果Aggregate包含 5 种不同类型的非根实体,那么Aggregate 工厂应该自己创建这些非根实体,还是应该有另外五个工厂(每个非根实体一个工厂),Aggregate 工厂将委托给它们创建特定类型的非根实体

谢谢

4

2 回答 2

8

在 Eric Evans 的 DDD 书中,第 138 页,它用粗体写成:

将整个聚合创建为一个整体,强制执行它们的不变量。

然后在下一页:

FACTORY 应该只能生产处于一致状态的对象。对于一个实体,这意味着创建整个聚合 [...]

具体来说,这意味着您将只有一个工厂来创建整个聚合。构建非根实体或值对象可能涉及其他类(工厂),但只有一个工厂负责创建聚合。这个工厂创建了一个完整的聚合,而不仅仅是一个根对象。

于 2013-02-12T18:23:28.980 回答
3

子根对象(例如OrderItemfor 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);
     }
}`
于 2013-02-14T17:33:32.263 回答