a)我有点疑惑在大多数情况下我们是否应该只有一个生产整个聚合的工厂,或者我们是否还有一个仅创建聚合根<的工厂/ em>的
b)构建整个聚合的工厂是应该自己构建 root 和非root 对象,还是应该委托建筑物非root 实体/ VO到其他工厂?
因此,如果 Aggregate 包含5种不同类型的非根实体,那么聚合工厂应创建这些非root实体本身或我们是否应该有额外的五个工厂(每个非根实体一个工厂),聚合工厂将委托创建特定类型的非root实体?
谢谢
答案 0 :(得分:7)
在Eric Evans的DDD书中,第138页,它是用粗体字写的:
将整个聚合作为一个整体创建,强制执行其不变量。
然后在下一页:
FACTORY应该只能生成一致的对象 州。对于ENTITY,这意味着创建整个AGGREGATE [...]
具体而言,这意味着您只需要一个工厂来创建整个聚合。 可能是构建非根实体或值对象所涉及的其他类(工厂),但只有一个工厂负责创建聚合。这个工厂创建一个完整的聚合,而不仅仅是一个根对象。
答案 1 :(得分:3)
创建子根对象(例如,OrderItem
的{{1}})由根实体本身处理,因此它可以以对外界不可见的方式强制执行变体。
所以典型的流程可能是:
Order
可以在实体中使用工厂,但外部世界不应该访问它。
var newOrder = orderFactory.CreateOrder(customer);
newOrder.AddOrderItem(product, quantity);