2010-07-26 65 views
3

在採用域驅動設計時,我經常遇到關於域對象的各種視角的問題,特別是在使用NHibernate時。透視本質上是查看域對象的方式。例如,一個簡化的模型:建模域驅動設計中聚合的不同視角

class Transaction 
{ 
    string Id { get; set; } 
    string CustomerName { get; set; } 
    DateTime Date { get; set; } 
    decimal Amount { get; set; } 
    decimal Tax { get; set; } 
} 

class Batch 
{ 
    string Account { get; set; } 
    string Number { get; set; } 
    DateTime? ClearDate { get; set; } 
    IList<Transaction> Transactions { get; } 
    decimal Total { get; } 
} 

該批次的總屬性是每筆交易金額的總和。當考慮單個批次時,這個模型運作良好,並且是該領域的適當表示。客戶端應用程序具有顯示批次集合的屏幕。該屏幕不需要關於批次內交易的任何細節,只需要總金額。在列表屏幕上使用相同的對象很慢。一種選擇是使總資產是可設置的,另一種選擇是創建一個新的類,如:

class BatchOverview 
{ 
    string Number { get; set; } 
    decimal Total { get; set; } 
} 

這將有自己的倉庫和自己的NHibernate的映射到數據庫視圖。

  1. 此對象是否屬於域模型,還是更多應用程序/ GUI特定?
  2. 批次概覽對象應引用批處理對象嗎?
  3. 這是一種常見的模式?
  4. 有沒有關於這個問題的任何指導?

DDD具有有界上下文的概念,但在這種情況下,上下文是相同的。 Batch類和BatchOverview類都引用相同的「實際」批次 - 它們是不同的視圖或透視圖。

回答

3

我會讓新課程脫離領域 - 這是我書中介紹的一個問題,我會這樣對待它。通常情況下,這個新對象將是隻讀的,以免有兩種改變數據的方式(其中一個不包含全套業務邏輯)。

但是,您不必因爲使用nHibernate而爲值設置setter。只要讓它使用支持字段,並讓nHibernate寫入。 (在你的映射中使用access =「field」)。

編輯: 我稱之爲PresentationModel或ViewModel取決於內部邏輯的數量。

我可能會保留對原始對象的引用 - 但可能只是一個Id。