如果人们认为这是被打死的,我提前道歉。我刚刚花了几个小时在 SO 中搜索和阅读了许多优秀的帖子,但我仍然感到困惑。
我困惑的根源是 DTO 与 DDD 和存储库。我希望我的 POCO 域对象具有智能,并且我想从存储库中获取它们。但似乎我必须违反一些封装规则才能使其工作,而且它似乎可以将 DTO 置于他们的头上。
下面是一个简单的示例:在我们的目录应用程序中,一个部件可以是一个包含许多其他部件的包。因此,Part POCO 有一个返回 IEnumerable<Part> 的“GetChildren()”方法是有意义的。它甚至可能在列表退出时做其他事情。
但是该列表是如何解决的呢?似乎存储库就是答案:
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 使用该部件,而不是相反。
这已经变得太长了。我的头在哪里拧开?