2

我的問題很簡單:如何讓我的類的私有數據存儲到存儲庫?不管我們採用的架構風格如何,每個人都同意業務對象不應該知道如何保存自己 - 也就是說他們不應該實現數據庫或其他持久性細節。但是,在我看來,只有業務對象知道他們需要保存的「什麼」。知識庫知道如何從數據庫中獲取數據,但如果知道如何將業務對象轉換爲數據庫術語,那麼它必須知道要翻譯什麼DDD - 管理域和存儲庫之間的耦合

考慮一下我可能會使用數據庫,但是我不會用hibernate註釋標記我的類,因爲我可能經常保存到一個平面文本文件。

假設我的課在這裏具體業務實體後實際命名的,什麼是錯做這樣的事情

interface Exporter 
{ 
    public void Export(String id, String value1, String value2); 
} 

interface Repository 
{ 
    public Entity FindById(String id); 
} 

class Entity 
{ 
    private String id; 
    private String value1; 
    private String value2; 
    private String derivedvalue; 

    public Entity() {} 

    public Entity(String id, String value1, String value2) 
    { 
     this.id = id; 
     this.value1 = value1; 
     this.value2 = value2; 
     this.derivedvalue = /* derived from id, value1, and value2 */; 
    } 

    public void DoBusiness() 
    { 
     // ... 
    } 

    public void Export(Exporter exporter) 
    { 
     Exporter.Export(this.id, this.value1, this.value2); 
    } 
} 

,並使用它像

FlatFileRepositoryAndExporter flatfile = new FlatFileRepositoryAndExporter(...); 
Entity entity = flatfile.FindById(...); 

// Do business logic 
entity.DoBusiness(); 

entity.Export(flatfile); 

據我所知,是可以幫助框架我,但在一天結束時,他們都依賴某種反思。我想知道,沒有反思,我如何靜態構造我的對象來暴露他們的數據,同時保持封裝。我能拿出的唯一答案就是這種訪問者模式。

+0

這很好。我做了一些類似的事情,我將依賴關係注入到實體中以執行各種事情(如持久化),並且對我來說工作得非常好。 –

+0

訪問者模式沒問題,但它爲域實體增加了一些噪音。你說得對,所有的框架和持久性客戶端都使用反射保存和檢索對象。最簡單的是一個沒有任何映射的xml或json序列化工具。 NoSQL數據庫通常也是一樣的。將持久性邏輯添加到您的域會迫使您開始測試它,這不是域測試的一部分。如果要序列化爲某個文件,則始終可以將存儲庫實現爲通用列表,並使用一些序列化將其保存到文件系統。 –

回答

1

我傾向於認同@MikeSW,使得外部持久化工具能夠通過小範圍調整(或者像ORM那樣反射)來收集域對象狀態,這通常比讓域對象本身完全控制什麼更簡單被堅持。

還有第三種方法是讓實體發出描述發生的事件而不是暴露其狀態的事件 - 即事件採購。然後,任何想要的人都可以傾聽他們的聲音,並以他們想要得到的任何形式堅持改變。

1

不要讓你的生活過於複雜。你試圖做的基本上是一個紀念品,它可以工作,但它有很高的維護成本(如非常無聊)。我通常json序列化的東西,無論我實際存儲他們,我已配置json.net序列化保護的屬性。所以基本上,我有保護屬性或只是受保護的setter,它工作得很好。

雖然不是一個純粹的解決方案,妥協是非常低的,對象的內部不暴露給其用戶。你可以有像

private List<string>_data=new List<string>(); 
public IEnumerable<string> Data 
{ 
    get { return _data;} 
    protected set { _data=value.ToList(); } 

} 

這種方法很簡單,非常可維護和持久性工具不可知論。

順便說一句,出口商,考慮到它的目的,應該只處理公衆成員,對象不應該知道它。