2009-09-01 187 views
2

我正在構建一個ASP.NET MVC應用程序,我正在使用存儲庫來存儲和檢索視圖對象。我的問題是,執行各種知識庫可以相互調用嗎? I.E. ICustomerRepository實現是否可以調用IAddressRepository的實現,還是應該處理自己對地址數據源的更新?存儲庫模式問題

編輯:

謝謝大家,在客戶/地址的例子是不是真實的。實際問題涉及三個集合,它們根據各自狀態的變化更新第四個集合。我在這種情況下,似乎是引入依賴關係與違反不重複自己原則之間的衝突。

回答

3

您應該爲每個聚合根擁有一個存儲庫。

我沒有你的域模型的知識,但感覺並不自然,讓我有一個IAddressRepository。除非「地址」是您域中的聚合根。

事實上,在大多數情況下,「地址」甚至不是一個實體,而是一個值對象。也就是說,在大多數情況下,「地址」的標識由其值(所有屬性的值)確定;它沒有單獨的「Id」(鍵)字段。
因此,在這種情況下,CustomerRepository應負責存儲地址,因爲Address是客戶聚合根的一部分。

編輯(確定,所以你的情況只是一個例子):

但是,如果你有,你就需要在資源庫中另一個倉庫等情況,那麼我認爲這是更好地去除功能從該存儲庫中取出,並放入一個單獨的類(Service)中。 我的意思是:我認爲,如果你有一個倉庫A內的一些功能,它依賴於另一個倉庫B,那麼這種功能並不庫A內屬於
相反,寫另一個類(這被稱爲在DDD服務),在你實現這個功能的地方。

無論如何,我不認爲庫中,應當真正相互調用。但是,如果您不想編寫服務,並且您確實希望將該邏輯保存在存儲庫本身中,則可以將該另一個存儲庫作爲參數傳遞給該特定方法。

我希望我自己有點清楚。 :P

+0

謝謝,服務類應該做的伎倆。 – Paul 2009-09-01 22:36:25

2

他們真的不應該互相打電話。存儲庫是您想要在您的域上執行的(或多或少)原子操作的抽象。他們擁有的依賴性越小越好。實際上,存儲庫的任何使用者都應該期望能夠將存儲庫類指向數據庫,並讓它在沒有大量配置的情況下執行必要的域操作。

他們也應該代表了你的域「集合」 - ,很多功能會根據周圍即關鍵焦點。我想知道爲什麼你會有一個單獨的地址信息庫?這不應該成爲您的客戶存儲庫的一部分嗎?

+0

這只是一個簡單的例子。實際模型是一個相當複雜的庫存系統,存在多個以多個現有集合爲中心的接口,用戶可以通過這些集合修改相同的庫存數據,這反過來也是它自己的(有限)直接修改的集合。 – Paul 2009-09-01 22:14:18

1

這取決於庫的類型(或至少後果做),但一般來說,如果你有數據倉庫稱呼對方你會遇到這樣的週期性(回購A和事情的問題 - >要求B - >需要C - 。oops,需要A)或遞歸數據加載(A->需要B & C - > C-需要D,E - > .... - > ..附加說明)。測試也變得更加困難。

例如,您需要加載地址存儲庫以正確運行客戶存儲庫,因爲客戶存儲庫調用地址存儲庫。如果您需要測試客戶回購協議,則需要對地址執行數據庫加載或以某種方式對它們進行模擬,最終,您將無法加載和測試任何單個系統存儲庫,而無需全部加載它們。

有那些依賴關係也是一種陰險的,因爲他們往往不明確的 - 通常你正在處理一個存儲庫作爲數據保持抽象 - 如果你必須要意識到他們是如何互相依賴,你可以不會將它們用作抽象,但是隻要您想使用它們,就必須管理加載過程。