2

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 パターンを使用しているので、請求書を編集するためのビューモデルもあります。私の質問は、ドメインとプレゼンテーションのビジネス ロジックが同じになるように、GrandTotal を計算するビジネス ロジックをどこに置くべきですか?

ドメインからプレゼンテーション (InvoiceInvoiceViewModel) にコードを複製する必要がありますか? または、ドメインとプレゼンテーションの両方が使用できるサービスを作成しますか?

4

1 に答える 1

2

DDD の集計の主な目標は、一貫性を維持することです。たとえば、一貫性は、GrandTotal が常に正しい値を持つことを意味します。そうは言っても、集約クラスが追加のクラスを使用してこの一貫性を得ることができないという規則はありません。

たとえば、総計を計算し、それをドメインとビュー モデルで使用することだけを担当するクラスを提供できます。DDDの概念とは何の関係もないので、サービスとは呼びません。例:

public interface IInvoiceLine
{
    decimal Amount {get;}
}

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

public class GrandTotalCalculator: ICalculateGrandTotal
{
    ...
}

これで、コードを複製することなく、ビュー モデルとドメインの両方でこの計算機を使用できます。さらに、インターフェイスが原因で、ビュー モデルとドメイン クラスの間に直接的な結合はありません。IInvoiceLineインターフェイスは、ビュー モデルとドメイン エンティティによって個別に実装できます。

于 2013-02-26T14:44:46.003 に答える