2014-02-06 37 views
0

假設我有,每一個客戶都有一個地址(在這種情況下,是一個實體),如下面的關係:這是如何構造DDD的類?

客戶{ID,名稱,MyAddress(地址的實例)}

我應該可以允許該公開以下選項的結構:

MyCustomer.MyAddress.Street = "Pine Street"; 
CustomerRepository.Save(MyCustomer); 

如果這級聯保存,既爲客戶類和Address類?或者說,是它更好地執行以下操作:

MyCustomer.MyAddress.Street = "Pine Street"; 
AddressRepository.Save(MyCustomer.MyAddress); 

不幸的是,地址確實是一個值對象,但是像DDD需要的ID標籤的存在,我不能讓它可以互換;舉例來說,如果我做了以下內容:

Customer1.setAddress(Customer2.getAddress()); 

兩個customer1表和顧客2現在已經到相同記錄,這是很危險的相同的結合。

+0

爲什麼地址是實體? – JefClaes

+0

在對域進行建模時,數據庫_doesn't exists_。你也在爲領域概念建模而不是結構。如果地址是客戶的一部分或與其相關聯,這是值得商榷的。 Customer1和Customer2沒有綁定到相同的記錄,因爲這是數據庫語言,在DDD中是邪惡的,至多它們提供了(或它們共享)具有所有含義的同一個地址。 DDD很簡單,如果你對域進行建模,你忘記了OOP,類,實體,值對象,ORM,表,一對多等等。所有這些都是技術細節,它們不那麼重要 – MikeSW

+0

@ JefClaes純粹是爲了舉例而已。 – AdrianGW

回答

2

您的樣本都不是DDD。每一個都是簡單的CRUD。

  1. 不要「設置字段」。做有意義的操作。
customer.MoveTo(new Address(...)) 
customer.FixAddressTypo(new Address(...)) 
  1. 庫對砂石料,沒有任何實體。確定你的聚合。 http://dddcommunity.org/library/vernon_2011/

  2. 爲什麼不將地圖值對象映射爲Cutomers表中的一堆字段?你不需要單獨的表格,只是因爲你有一個單獨的類。

  3. 值對象應該是不可變的。

+1

其實這些行爲不屬於客戶,他們是客戶的使用案例。 1.在域圖層中,存儲庫用於聚合根,但在域外可用於實體或視圖模型等。指定此區別很重要,存儲庫模式不能僅用於DDD。 2.在討論域建模時,我們不關心數據庫,所以我們不關心值對象是如何映射的。 – MikeSW

+0

「不要」設置字段「。做有意義的操作。「很棒,對我來說很明顯,我確實沒有從CRUD轉換到DDD,關於第二點,我們說地址是可選的嗎?或者地址內的特定字段是可選的,現在我會在表中留空,或者至少必須對它進行非規範化處理@Mike這是我相信我正在進行持久化的一點,存儲庫是一種設計模式,可以在_multiple_位置中使用 – AdrianGW

+0

@MikeSW,那麼這不是一個例子case?有什麼區別? – AdrianGW

相關問題