【问题标题】:Accessing entities that's not an aggregate root访问不是聚合根的实体
【发布时间】:2011-01-31 13:38:30
【问题描述】:

我正在研究 DDD,我有一些想法。在购物网站上,我有典型的订单。

public class Order
{
    public ICollection<OrderRow> OrderRows { get; set; }
    public ICollection<Payment> Payments { get; set; }
    ...
}

付款似乎很自然地放在订单上。下订单或处理订单时,付款是订单的一部分。

但后来管理员想单独处理付款。例如。在管理界面中有需要处理的付款列表。

我应该怎么做? Payments 是否应该从订单中移除并成为其自己的根聚合?

【问题讨论】:

    标签: domain-driven-design entity aggregateroot


    【解决方案1】:

    我的理解是聚合可以并且将会重叠,允许您定义对当前操作的业务上下文最有意义的聚合。

    因此,在这种情况下,是的,在按照 Order 工作时,您会将 Payments 作为 Order 聚合的一部分公开,但这并不妨碍您还拥有一个将 Payment 作为聚合根公开的专用 PaymentRepository。

    【讨论】:

    • 如果在大多数域中没有重叠,那将是非常不自然的。
    【解决方案2】:

    我认为支付实体不属于订单聚合。正如您所写的那样,您具有单独与付款一起使用的功能。这意味着付款不仅仅在订单上下文中使用。这意味着付款不属于订单聚合:)。
    但是,Order 类中可能有 Payments 属性,即使它不是 Order 聚合的一部分。

    【讨论】:

      【解决方案3】:

      如果没有订单就无法存在付款,则付款不是聚合根。

      如果它不是聚合根,则从 OrderRepository 加载适当的 Order 对象并在其中的 Payment 实体上进行操作似乎具有最高的 DDD 完整性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2016-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多