0

我想用的是吉米·尼爾森在他的書中Applying DDD with Patterns提到的一個想法,那就是,如果我有一個像產品例如,我將一個實體喜歡拍攝該實體的歷史信息的快照,類似ProductSnapshot但我想知道我可以如何實現這與一個ORM(我目前正在使用實體框架)。我現在面臨的主要問題是,如果我有另一實體像訂單行是通過其構造函數接收產品那麼實體框架將需要你做的那種類型的公共財產要持續存在,因此這會強迫我有這樣的事情:管理實體和其快照與ORM

class OrderLine { 
public Product Original Product {get; set;} 
public ProductSnapshot Snapshot {get; set;} 
} 

,這似乎笨拙,不直觀,我不知道如何處理得當,當涉及到數據綁定(對哪些財產我應該綁定)最後我認爲產品實體ProductSnapshot值對象加上訂單行被接受時,快照只取,之後不需要產品

回答

1

在做DDD時,忘記數據庫存在。這意味着ORM也不存在。現在,由於您不必關心持久性和ORM限制,因此可以根據域需求對ProductSnapshot進行建模。

創建一個包含所有必需成員的ProductSnapshot類。該類可能是SnapshotService.GetSnapshot(Product p)的結果。獲得ProductSnapshot後,只需將其發送到存儲庫SnapshotsRepository.Save(快照)即可。作爲一個快照,這意味着它可能更多是一個數據結構,一個「愚蠢」的對象。它也應該是不變的,'凍結'。

存儲庫將使用EF來實際保存數據。你決定EF實體和關係是什麼。 ProductSnapshot被持久化視爲一個業務對象(實際上它只是一個簡單的Dto並不重要),並且EF實體可能看起來非常不同(例如,我將業務對象以序列化形式存儲在鍵 - 價值表)根據您的查詢需求。

一旦您定義了EF entites,您需要將ProductSnapshot映射到它們。 ProductSnapshot本身很可能可以用作EF實體,因此您不需要執行任何映射。

問題是,拍攝快照似乎是域行爲。您只有在獲得快照後才處理EF,並且完全按照與其他業務對象相同的方式執行操作。

+0

您如何看待綁定問題,因爲如果我只有一個ProductSnapshot類型的屬性,那麼該屬性將爲null,直到OrderLine被確認,並且同樣的事情會發生,如果我有一個產品類型的屬性,但在相反的情況? –

+0

我想你誤解了我。產品快照是一個將由存儲庫保存的業務對象。 OrderLine類可能包含產品快照,但這不是EF問題。存儲庫應該知道如何在有或沒有產品或快照的情況下組裝ORDERLine。該存儲庫使用EF來獲取相關數據,然後將所有內容放在一起。簡而言之,保持Domain和Persistence層分離,並且在建模業務對象時不要混合ORM。 ORM可幫助您更輕鬆地使用db,但存儲庫負責處理業務對象。 – MikeSW

+0

您必須決定此處的OrderLine,Product和ProductSnapshot是否是業務對象,或者它們是我希望不用於對域進行建模的EF實體。 – MikeSW

0

爲什麼OrderLine必須具有ProductSnapshot屬性?我想,如果您需要獲取歷史信息,您可以從產品類鏈接到產品快照,或者,如果您只是想在某些條件下保存產品狀態,只需在產品部分類中實施SaveSnapshot方法,或者它的擴展方法。