如果人們認爲這已被毆打致死,我很抱歉。我剛剛花了幾個小時搜索和閱讀許多優秀的帖子,但我仍然困惑。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