聚合根

我试图让我的双手肮脏的学习DDD(通过开发一个示例电子商务网站,像OrderOrderLinesProductCategories等实体)。 从我能理解的Aggregate Root概念中,我认为Order类应该是OrderLine的聚合根。

到目前为止,事情进展良好,但是当它定义来自UI的创建订单流时,我感到困惑。 当我想将订单行添加到我的订单对象时,应该如何获取/创建OrderLine对象的实例:

  • 我应该在UI / Service类中硬编码新的OrderLine()语句OrderLine()
  • 我是否应该在Order类中定义一个带有productIDquantity等参数的方法?
  • 此外,如果我想使用DI从UI或Order类中删除硬编码的实例,该怎么办。 对此最好的方法是什么?


    从我能理解的Aggregate Root概念中,我认为Order类应该是OrderLine的一个集合根。

    是的,OrderLine应该很可能在Order根下,因为OrderLine可能在父Order之外没有任何意义。

    我应该在UI / Service类中硬编码新的OrderLine()语句吗?

    可能不会,虽然这是它经常发生的情况,而且它是可以工作的。 正如我所看到的那样,问题在于对象构造经常发生在不同的上下文中,并且验证约束根据上下文而不同。

    我是否应该在Order类中定义一个带有productID,quantity等参数的方法?

    如:

    public OrderLine AddOrderLine(Product product, int Quantity ... )
    

    这是做到这一点的一种方法。 注意我使用了Product类而不是ProductId。 有时候一个比另一个更好。 我发现我出于各种原因而使用了很多 - 有时候我有这个ID,并且没有很好的理由来拉取聚合根,有时我需要另一个根来验证操作。

    我这样做的另一个方法是为孩子实现一个自定义集合。

    所以我有:

    order.OrderLines.Add(product, quantity);
    

    这感觉更自然或OO,特别是如果一个实体根具有许多子集合,它就避免了混乱。

    order.AddOrderLine()order.AddXXX()order.AddYYY()order.AddZZZ()

    order.OrderLines.Add()order.ZZZs.Add()order.YYYs.Add()

    此外,如果我想使用DI从UI或Order类中删除硬编码的实例,该怎么办。 对此最好的方法是什么?

    这将是工厂模式的教科书案例。 我将这样一个Factory注入到我的自定义集合中以支持这些Add()方法中的实例化。


    您可以使用OrderLine Factory来获取Orderlines的实例。 您将使用传入工厂方法的参数“新建”工厂中的OrderLine对象,然后将新实例返回给Order对象。 总是尝试隔离实例化,而不要在UI中执行。 这里有一个问题使用这种技术。

    这是一本很棒的书,你会发现DDD很有用。

    链接地址: http://www.djcxy.com/p/49075.html

    上一篇: Aggregate Root

    下一篇: Is it possible to run a cuda kernel on multiple gpus