2

新しいシステムのバックエンドを開発しており、DDD を使用してみます。コア プロジェクトで DDD エンティティを定義し、リポジトリ パターンを使用して永続化レイヤーからそれらのエンティティを読み取りました。

クライアントがバックエンドにアクセスできるように、WCF サービスが必要です。この WCF サービスとの間で DTO を送受信しています。

典型的な Order, Orderrows シナリオがあるとしましょう。私のWCFサービスでは、関数を宣言します

IEnumerable<DTO.OrderRows> GetOrderRowsForOrder(DTO.Order o)

この方法を実装する方法についてアドバイスが必要です。私には2つの異なる選択肢があります。

  1. 私のドメイン オブジェクトを使用して orderrows を読み取ります。

    Core.Order order = _orderRepository.GetById(o.Id);
    IEnumerable<Core.OrderRow> orderRows = order.GetOrderRows();
    IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
    
    return dtos;
    
  2. リポジトリを直接使用して orderrows を読み取ります。

    IEnumerable<Core.OrderRow> orderRows = _orderRowsRepository.GetOrderRowsForOrder(o.Id);
    IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
    
    return dtos;
    

私には、選択肢 1 の方が「オブジェクト指向」に見えますが、選択肢はありません。2 の方がシンプルで効果的です。

私の質問は、DDD を使用するときにどちらを使用するかということです。ここで DDD を使用するのは適切ですか?

(これはもちろん単純なサンプルですが、注文のリストの orderrows を取得する必要がある場合はどうすればよいでしょうか?)

4

3 に答える 3

4

集約ルートによって異なります。

  1. Order が注文行を含む集約ルートである場合、注文を読み取るときに常に入力されるOrderプロパティが必要です。OrderRowsそのため、注文から注文行を取得するときに「非効率」になることはありません。これは、注文行が既にメモリにあるためです。
  2. OrderRow がそれ自体が集約ルートである場合、 にはプロパティもメソッドもありません 。代わりに、 を使用して、2 番目の例で概説したのと同様に、注文のすべての注文行を取得します。OrderRowsGetOrderRowsOrderOrderRowsRepository
于 2013-09-18T08:29:30.310 に答える
2

私は 2 番を使用していましたが、最近 1 番よりも気が変わりました。その理由は、2 番を使用すると、最終的に、ドメイン オブジェクト (エンティティ) について知っていて、答えることができる必要があります。あなたの言葉で; よりオブジェクト指向です。

于 2013-09-18T08:36:28.207 に答える
0

Core.Order が集約ルートであると仮定すると、次のような OrderRows のプロパティが既に含まれています。

public class Order
{
    public IEnumerable<Core.OrderRows> Rows { get; set; }

}

そのため、GetOrderRows() でクエリを実行するのではなく、Rows プロパティを呼び出すように少し変更を加えた選択肢 #1 が適切です。

Core.Order order = _orderRepository.GetById(o.Id);
IEnumerable<Core.OrderRow> orderRows = order.Rows;
IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());

return dtos;
于 2013-09-19T18:35:40.587 に答える