我正在努力学习DDD(通过开发一个包含Order
,OrderLines
,Product
,Categories
等实体的示例电子商务网站。
根据我对Aggregate Root概念的看法,我认为Order
类应该是OrderLine
的聚合根。
到目前为止情况还不错,但是当它从UI定义创建订单流时我很困惑。
当我想向订单对象添加订单行时,我应该如何获取/创建OrderLine
对象的实例:
OrderLine()
语句进行硬编码
productID
类中定义一个包含quantity
,Order
等参数的方法吗?此外,如果我想使用DI从UI或Order
类中删除硬编码实例,该怎么办?对此最好的方法是什么?
答案 0 :(得分:2)
您可以使用OrderLine Factory获取订单行的实例。您将在工厂中“新建”OrderLine对象,并将参数传递给工厂方法,然后将新实例返回到Order对象。始终尝试隔离实例化,而不是在UI中执行此操作。有一个问题here使用了这种技术。
这是一本很有用的书,你会发现DDD。
答案 1 :(得分:2)
从我能感知到的东西 聚合根概念我以为订单 class应该是一个aggreagrte root 订单行。
是的,OrderLine最有可能属于Order root,因为OrderLine可能在父订单之外没有意义。
我应该硬编码新的OrderLine() 我的UI /服务类中的语句
可能不是,虽然这是经常发生的事情并且它可以起作用。我认为问题在于,对象构造经常发生在不同的上下文中,验证约束因内容而异。
我应该定义一个方法 参数如productID,数量等 在订单类?
如:
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()
此外,如果我想删除该怎么办? 来自UI的硬编码实例化 或使用DI的Order类。什么 对你来说这是最好的方法吗?
这将是Factory模式的教科书案例。我将这样的Factory注入我的自定义集合中,以支持那些Add()
方法中的实例化。