2013-02-26 110 views
2

我正在開發使用DDD模式的應用程序。將領域層和表示層之間共享的DDD中的業務邏輯放在哪裏?

我在域層有Invoice類。

public class Invoice 
{ 
    List<InvoiceLine> list = new List<InvoiceLine>(); 

    public DateTime Date { get; set; } 

    public Customer Customer { get; set; } 

    public decimal GrandTotal 
    { 
     get 
     { 
      // Simplified grand total. 
      // It's actually include tax and discount to calculate. 

      decimal total = 0m; 
      foreach(InvoiceLine line in Lines) 
       total += line.LineTotal; 

      return total; 
     } 
    } 

    public IEnumerable<InvoiceLine> Lines 
    { 
     get { return list; } 
    } 

    public void AddLine(InvoiceLine line) 
    { 
     lines.Add(line); 
    } 
} 

我使用mvvm模式,所以我也有一個viewmodel編輯發票。我的問題是我應該在哪裏放置業務邏輯來計算GrandTotal,以便域和演示文稿上的業務邏輯是相同的?

我應該只複製代碼從域到演示文稿(InvoiceInvoiceViewModel)?或者提供域名和演示文稿都可以使用的服務?

回答

0

DDD中聚合的主要目標是保持一致性 - 例如,您的案例一致性意味着GrandTotal將始終具有正確的值。也就是說,沒有規則說明聚合類不能使用額外的類來獲得這種一致性。

例如,您可以提供一個類,其唯一責任是計算總計並將其用於您的域和視圖模型。我不會稱之爲服務,因爲它與DDD概念無關。例如:

public interface IInvoiceLine 
{ 
    decimal Amount {get;} 
} 

public interface ICalculateGrandTotal 
{ 
    decimal Calculate(IEnumerable<IInvoiceLine> lines); 
} 

public class GrandTotalCalculator: ICalculateGrandTotal 
{ 
    ... 
} 

現在,您可以在視圖模型和域中使用此計算器,而無需代碼重複。另外由於接口,視圖模型和域類之間沒有直接的耦合。接口可以由視圖模型和域實體單獨實現。

+0

這是一個很好的解決方案。謝謝! – 2013-02-26 15:21:17