从我能感知到约 聚合根概念,我想订购 类应该是一个aggreagrte根 订单行。
是的,OrderLine应该很可能在Order根下,因为OrderLine可能在父Order之外没有任何意义。
我应该硬编码在我的UI /服务类
可能不是新的订单行() 声明,尽管这往往是如何发生的,它是由工作。正如我所看到的那样,问题在于对象构造经常发生在不同的上下文中,并且验证约束根据上下文而不同。
我是否应该在Order类中定义一个包含 参数的方法,如productID,数量等 ?
如:
public OrderLine AddOrderLine(Product product, int Quantity ...)
这是做这件事。注意我使用了Product类而不是ProductId。有时候一个比另一个更好。我发现我出于各种原因而使用了很多 - 有时候我有这个ID,并且没有很好的理由来拉取聚合根,有时我需要另一个根来验证操作。
我这样做的另一种方法是为孩子实现一个自定义集合。
所以我必须:
order.OrderLines.Add(product, quantity);
这感觉多了几分自然的或面向对象,特别是如果实体根有它避免了杂波很多孩子集合。
order.AddOrderLine()
,order.AddXXX()
,order.AddYYY()
,order.AddZZZ()
与
order.OrderLines.Add()
,order.ZZZs.Add()
,order.YYYs.Add()
而且,如果我想从UI 删除 硬编码实例或Order类使用DI。什么 将是最好的办法呢?
这将是工厂模式的教科书案例。我将这样一个工厂注入到我的自定义集合中,以支持那些Add()
方法中的实例化。
我不认为order.OrderLines.Add是更多的面向对象。有一个OO东西叫封装。如果你的班上有很多XXX,ZZZ,YYY,它可以重新设计它(好的OO设计往往有许多小物体)。你可以谷歌封装集合的好处,避免火车残骸(流畅的接口是另一种情况)。 – 2011-11-29 11:57:39