【问题标题】:Few confusing things about factories in DDDDDD中关于工厂的一些令人困惑的事情
【发布时间】:2013-02-12 18:12:43
【问题描述】:

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

b) 构建整个聚合的工厂应该自己构建root非root对象还是应该委托构建non-root 实体/VO 到其他工厂?

因此,如果 Aggregate 包含 5 种不同类型的 非根实体,那么 Aggregate factory 是否应该创建这些 非根实体 本身,或者我们应该有另外五个 factories(每个非根实体一个工厂),Aggregate factory 将委托创建特定类型的非根实体

谢谢

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

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

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

    然后在下一页:

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

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

    【讨论】:

    • 反对让工厂专用于特定类型的理由是什么(以及聚合工厂将委托创建特定类型),特别是考虑到我们经常希望在预先存在的聚合中添加元素,在这种情况下,我们必须创建工厂来创建非根对象?
    • @user437291:我想你可以有一个非根对象的工厂,但你的根对象的工厂仍然应该创建一个完整且有效的聚合。拥有一个只创建根的工厂是没有意义的,但它可能会在其他类/工厂的帮助下创建非根对象。
    • 但我认为您要提出的观点是,将创建整个聚合的工作分配给多个工厂(而不是由单个工厂完成所有对象创建)不会带来有什么好处吗?
    • @user437291:如果您需要“将元素添加到预先存在的聚合中”,并且构建这些元素很复杂,那么我认为这个对象的工厂可以带来一些好处。但默认情况下,我会为每个聚合使用一个工厂。
    • 请问这是否意味着non-root 可以拥有它们的工厂方法并由AR 在创建整个AGGREGATE 的过程中使用?如果答案是肯定的,那么如何防止客户端代码或其他聚合滥用非root`工厂方法!
    【解决方案2】:

    子根对象的创建(例如,OrderItemOrder)由根实体本身处理,因此它可以以对外界不可见的方式强制执行变体。

    所以一个典型的流程可能是:

    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);
         }
    }`
    

    【讨论】:

    • "工厂可能在实体内部使用,但不应被外界访问。"那么在任何情况下都不应将非根工厂实现为服务?
    • 工厂不是服务,而是工厂。服务处理实体之间的交互(包括与外部世界的交互),而工厂抽象出实例化。您可能会发现需要在根之外创建非根对象 - 在这种情况下,您需要查看模型。要么子对象实际上不在根中,要么您应该通过根。
    • “工厂不是服务,它是工厂。”但根据 Evans 的说法,如果需要,工厂也可以实现为服务——在这种情况下,工厂就是服务?!
    • 您指的是 Evans 书中的哪一部分?工厂是封装对象实例化的对象,并允许轻松替换替代实现。虽然服务可能会实例化对象,但它应该在内部适当地将其推迟到工厂,以免违反单一职责原则。
    • 请问OrderItem是否有自己的工厂方法并用于根工厂方法?在这种情况下,我们如何防止客户端代码滥用非根聚合中的工厂方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2010-12-17
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多