聚合根
我试图让我的双手肮脏的学习DDD(通过开发一个示例电子商务网站,像Order
, OrderLines
, Product
, Categories
等实体)。 从我能理解的Aggregate Root概念中,我认为Order
类应该是OrderLine
的聚合根。
到目前为止,事情进展良好,但是当它定义来自UI的创建订单流时,我感到困惑。 当我想将订单行添加到我的订单对象时,应该如何获取/创建OrderLine
对象的实例:
OrderLine()
语句OrderLine()
Order
类中定义一个带有productID
, quantity
等参数的方法? 此外,如果我想使用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