2012-11-16 69 views
0

我刚刚阅读了关于聚合的一章,并发现我误解了某些内容。 我们有三个对象:成员,项目,投标。 这里是一本书的代码片段:域模型聚合

public class Member 
{ 
    public string Id {get; set;} 
    ... 
} 

public class Item 
{ 
    public string Id {get; set;} 
    public IList<Bid> Bids {get; set;} 
    ... 
} 

public class Bid 
{ 
    public Member Member {get; set;} 
    ... 
} 

作者日期写的项目和它的出价是一个总的投标不无项目是有意义的。所以Item和Member是聚合根。 但是我认为如果没有会员,Bid也没有意义。而且这似乎是合乎逻辑的。那么在这种情况下什么是竞标?它是项目聚合的一部分吗?

回答

2

首先,骨料聚合根不同的概念。在这种情况下,Item和Bid可能是同一个聚合的一部分,但只有一个,我认为Item是聚合根(AR)。

定义哪个类是AR很大程度上取决于有界上下文(BC)。此外,该成员类可能仅在BC中被表示为一个简单的Id,但这不是您可能在不同的BC中使用的成员(您会看到DDD非常棘手)。

该项目涉及投标和成员,它们一起形成一个聚合,但是项目是聚合根,即其他人用来管理聚合的门面对象。

+0

那么如何检索会员的出价?我想,会员类需要引用此成员出价的物品。然后在Item聚合根上可能有一个函数来检索该商品的成员出价。 –

+0

我写道,Item和Member是AR。嗯,我不同意在一个域模型中聚合可能在不同的BC中。 – Danil

+0

@ Meta-Knight对域进行建模与数据库存储无关,此示例非常简单,因此它类似于如何对ORM实体进行建模,但就是这样。我一直在考虑域和持久性的不同,所以我在处理域时并不关心存储。 – MikeSW

1

虽然不完全一样,但这与this SO question非常相似,其中理查德Cirerol的答案是体面的。

但是,我会告诉你the book on page 71,其中的图表显示出价有一个成员的参考,因此可以达到OUT获取该信息,但成员无法到达IN。进入的唯一方法是通过物品。因此,该项目是示例中的控制点。这有助于保持清晰和事务性的内容。