我的問題很簡單:如何讓我的類的私有數據存儲到存儲庫?不管我們採用的架構風格如何,每個人都同意業務對象不應該知道如何保存自己 - 也就是說他們不應該實現數據庫或其他持久性細節。但是,在我看來,只有業務對象知道他們需要保存的「什麼」。知識庫知道如何從數據庫中獲取數據,但如果知道如何將業務對象轉換爲數據庫術語,那麼它必須知道要翻譯什麼。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);
據我所知,是可以幫助框架我,但在一天結束時,他們都依賴某種反思。我想知道,沒有反思,我如何靜態構造我的對象來暴露他們的數據,同時保持封裝。我能拿出的唯一答案就是這種訪問者模式。
這很好。我做了一些類似的事情,我將依賴關係注入到實體中以執行各種事情(如持久化),並且對我來說工作得非常好。 –
訪問者模式沒問題,但它爲域實體增加了一些噪音。你說得對,所有的框架和持久性客戶端都使用反射保存和檢索對象。最簡單的是一個沒有任何映射的xml或json序列化工具。 NoSQL數據庫通常也是一樣的。將持久性邏輯添加到您的域會迫使您開始測試它,這不是域測試的一部分。如果要序列化爲某個文件,則始終可以將存儲庫實現爲通用列表,並使用一些序列化將其保存到文件系統。 –