2009-02-15 65 views
5

我剛開始研究域驅動設計,很可能我對實體/值分隔的理解是錯誤的,所以如果這樣請讓我知道。如何處理需要查找數據庫中的數據的值對象

根據我的理解,由於其身份完全由其屬性定義,地址是典型值對象。根據我的理解,這意味着除了地址之外,不應該有單獨的存儲庫或數據訪問對象。

這對我來說是一個困境,因爲在我的情況下,地址包含一個國家,其中國家有一個國家的名稱和國家代碼,國家代碼列表應該從數據庫中加載。

我的問題是,我該如何設計?我希望人們能夠使用新的操作員創建地址,但我不想爲國家創建數據訪問對象,如果我這樣做,我當然不希望在地址對象中引用它。

我有一些想法,但我想聽任何人可能有的建議。

回答

0

這一點,因爲在 我的情況的地址包含國家 如果一個國家有一個名字和一個 國家代碼和 國家代碼列表中爲我創建一個兩難應該被加載 在來自數據庫。

Address對象沒有國家列表作爲其屬性。相反,它會有一個國家對象的單個實例。表示層將提供一個國家對象列表,可能位於下拉列表中。加載一個特定地址後,您可以將下拉列表的值設置爲等於作爲Address對象的屬性的國家對象的國家ID。換句話說:

myDropDown的(含有國家的對象的列表)中選擇對象值= address.Country 或myDropDown的密鑰值= address.Country.ID

現在,來填充表示層,數據訪問圖層應提供返回Country對象的原始列表的函數。在.NET的方式,這將是這樣的:

Namespace Dal 

    Public NotInheritable Class Countries 
    ... 
    Public Shared Function Read(ByVal countryId as Integer) As BusinessObjects.Country 
    ... 
    Public Shared Function ReadList() As List(Of BusinessObjects.Country) 
    ... 
+0

我只是在設計領域模型,並沒有強制如何使用它。問題是用戶可以創建新的Country對象,但是如果他們這樣做,那麼我如何確保它處於有效狀態? – 2009-02-15 16:06:00

+0

這種方法做了太多的假設。我不能認爲會有一個可以訪問國家列表的表示層。也就像我說的一個數據訪問對象的值對象只是似乎錯了...... – 2009-02-15 16:14:08

1

讓我先說,我與域唯一的經驗驅動設計正在讀維基百科的文章幾分鐘前開始。這就是說,這裏是我對你的問題的想法:

我同意地址對象不應該要求任何數據訪問對象,那麼如何處理國家代碼並建立地址對象的地址工廠基於用戶?這樣,工廠將保存數據訪問對象,並且您的地址對象可以保持僅值。

如果根據DDD這不是猶太潔食,請讓我知道。我很好奇看到社區的其他人提出了什麼。

+0

不知道這是如何爲DDD網格,我認爲它很好。這與我的想法很相似,不過我剛剛有一個地址類來管理靜態國家/地區列表,該列表在應用程序啓動時設置。我想我更喜歡你的。 – 2009-02-15 16:09:44

3

DDD中沒有任何內容阻止值對象持有對實體的引用。因此你的地址應該提及一個國家實體。

+0

也許,但考慮到在我的域內它只用於地址,使國家成爲實體似乎是錯誤的 – 2009-02-15 23:21:02

1

採用DDD方式,您可以首先考慮應用程序的需求,然後從那裏構建模型。

您不應該擔心國家只能在地址中使用。把它變成一個實體本身並不是錯誤的。主要問題是:你認爲一個國家是具有身份的東西嗎,還是僅僅由屬性來定義?如果你有兩個國家有相同的名字(和相同的國家代碼),你能看到有什麼不同嗎?

也許你應該考慮讓國家成爲一個價值對象。它不會阻止您從數據庫中加載一些國家/地區的存儲庫加載列表,或者根據其代碼加載國家/地區。在實現方面,您的存儲庫仍然可以從數據庫加載一個國家列表並將其緩存在內存中。或者它可以硬編碼,或從XML讀取。你的域名模式不會在意。

您可能會在接受其他參數中的國家/地區代碼的地址上創建工廠方法。然後它將使用倉庫創建一個國家實例並返回一個正確的地址對象。

關於聚合的思考也可以產生關於存儲庫佈局的一些想法。

希望這會有所幫助

相關問題