如果人们认为这已被殴打致死,我很抱歉。我刚刚花了几个小时搜索和阅读许多优秀的帖子,但我仍然困惑。DDD,存储库和封装
我的困惑的来源是DTO与DDD和存储库。我希望我的POCO域对象具有智能,并且我想从存储库中获取它们。但是,似乎我必须违反一些封装规则才能使其发挥作用,并且似乎可以将DTO变成他们的头像。
下面是一个简单的例子:在我们的目录应用程序中,零件可能是一个包含许多其他零件的包。因此,Part POCO有一个'GetChildren()'方法是有意义的,该方法返回IEnumerable < Part>。它甚至可能在列表中列出其他东西。
但是该列表如何解决?好像仓库是答案:
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
而且
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
所以,现在我的目录,除了从存储库(正确地)装载部分的消费者,还可以绕过某些部分封装通过直接调用GetChildren(part)来实现逻辑。那不好吗?
我读到存储库应该提供POCO的,但是DTO的可以在层间传输数据。计算了很多零件属性 - 例如,价格是根据复杂的定价规则计算的。价格甚至不在存储库中的DTO中 - 因此,将定价数据传递回Web服务似乎需要DTO消耗该部分,而不是相反。
这已经太长了。我的头在哪里拧开?
有趣。但是我感到困惑的是'将GetChildren(part)移动到IPartService中,并将其从部分中移除“,然后'Part类仍然有一个Childparts属性。如果部分因某种原因需要按摩其孩子会怎样? – n8wrl 2009-07-17 15:40:13