2009-10-18 97 views
3

我的問題是可以聚合根實體調用庫

可以聚合根實體有方法,其中,它會調用一個存儲庫?

我知道它不應該,但要作爲Eric的書也什麼都不說清楚:(

一兩件事,我在哪裏可以得到領域驅動設計單元測試例得到證實?

+0

我的意思不是密集或任何東西,但我們應該知道埃裏克是誰? – 2009-10-18 07:14:33

+12

是啊,DDD + Eric =埃裏克埃文斯,大家都知道。 – alexn 2009-10-18 14:38:06

+0

另請參閱:[DDD - 實體無法直接訪問存儲庫的規則](http://stackoverflow.com/questions/5694241/ddd-the-rule-that-entities-cant-access-repositories-directly) – codeulike 2011-05-05 17:07:16

回答

2

這是一個宗教問題。 有些人認爲這沒有問題,而其他人可能認爲這樣做是異端。雖然我通常總是將我的Repository遠離我的領域模型(並且有一個上游服務對象處理Repository),但我有一個項目「需要」讓Repository可以從領域模型訪問。 這是由於Domain對象需要根據業務邏輯=>使用規範對象/ Linq到nHibernate(關於如何過濾屬於該域對象的數據的責任和知識)和/或性能原因來檢索特定數據。

這樣做的一個警告是如何獲得對Domain對象的Repository引用 - 在這種情況下,我使用了IOC工具的Constructor注入。

你是否應該這樣做或不取決於你的解決方案/用例/使用技術等等

3

可以嗎?是的。

應注意什麼?-No。

所有的答案都不過上下文敏感的,和你不提供你的。

通用建議是尋找「服務」或「規範」類型。

+0

感謝Martin的回覆 我也認爲Enities不應該調用存儲庫,但是在一本書中,作者給出了他從Person Entity中調用Repository的例子,該書是Martin Fowler的「企業應用程序架構模式」。 請指教 – batwadi 2009-10-19 13:47:18

1

行爲,是什麼,IT,IS。 Eric從稱爲「QueryService」的經紀賬戶實體調用存儲庫類似於實用程序。他提到這對於一個真正的項目來說不是一個好設計。所以你會怎麼做?

public class Clerk 
{ 
    public Clerk() 
    { 
    } 

    //Store Report in Database 
    public void File(Report); 
    { 
     ReportRepository.Add(Report); 
    } 
} 

你可以這樣做,但最好告訴Clerk使用哪個Repository。

public class Clerk 
{ 
    private IReportRepository _reportRepository; 

    public Clerk(IReportRepository ReportRepository) 
    { 
     this._reportRepository = ReportRepository 
    } 

    //Store Report in Database 
    public void File(Report); 
    { 
     this._reportRepository.Add(Report); 
    } 
}