4

アプリケーションへのインターフェースが 2 つあるとします。

  • Web フロントエンド
  • データを提供するバックエンド

どちらも Web サービスと通信し、その Web サービスはビジネス ロジックを処理し、オブジェクトを永続化する別のデータ レイヤーと通信します。

では、Web サービスの各クライアントがその Web サービスの DataContract を使用する場合、何のためにドメイン オブジェクトが必要なのでしょうか?

ドメイン駆動設計はここでどこに当てはまり、私のアーキテクチャにどのような利点をもたらしますか?

それとも、私がすでに持っているものは問題なく、ドメイン オブジェクトはまったく必要ないということですか?

ドメイン駆動設計の意味と目的を誤解していますか?

4

2 に答える 2

0

データコントラクトは、クライアントとサーバーが相互に交換するメッセージにすぎません。

WCFサービスは、メッセージを受け入れて処理し、ビジネスロジックで処理できるようにするレイヤーです。

ドメインオブジェクトは、処理されたメッセージを受け取り、必要なアクションを実行してから、適用する必要のあるイベントを適用するビジネスロジックになります。

より多くのコマンドクエリ分離原則(CQS)に従うと、コマンド(挿入/更新/削除)がWCFサービスに実行され、何も返されません。クライアントは、コマンドとは別にWCFサービスからの読み取りを要求します(つまり、InsertOrderコマンドはOrderを返しません。そのために、別の要求を発行する必要があります)。

そのすべてにおいて、データコントラクトはWCFサービスとの間のメッセージです。ドメインは、読み取りを可能な限り正確にするために発生する必要のあるすべてのビジネスロジックを処理するサービスの背後にあります。

私はCQRS(コマンドクエリ責任分離)の観点からこれに答えていますが、これが私がどこから来たのかを説明することを願っています。

他の質問に答えるには:-ドメインオブジェクトが必要ですか->はい、そうする必要があります

于 2011-08-06T14:36:44.597 に答える
0

ドメイン オブジェクトは何のために必要ですか?

アプリケーションにドメイン オブジェクトが必要ない場合があります。通常、DDD は次のようにサービス レイヤーに適合します。 サービス レイヤーは、操作コントラクトとデータ コントラクトを公開します。多くの場合、データ コントラクト クラスはドメイン内のオブジェクトに対応しますが、動作を持たないためドメイン オブジェクトではなく、特定のサービスが関係するデータの表現にすぎません。サービス内のデータ コントラクト オブジェクトとドメイン オブジェクト間の相互作用の簡単な例を次に示します。

public MyEntityDto GetMyEntity(string id) {

  var entity = this.myEntityRepository.Get(id);
  if (entity == null)
    return null;
  return new MyEntityDto(entity);

};

この場合、MyEntityDto は MyEntity のDTOオブジェクトであり、サービスがクライアントに提供したい MyEntity の特定のプロパティを公開する役割を果たします。

DDD の価値が発揮されるのは、ドメインがより複雑で、関連する動作がある場合です。

class MyEntity {
 public void ChangeState(MyEntityState state) {
    if (!IsValidState(state))
      throw new Exception("Not a valid state.");
    // further domain logic here...
 }
}

[DataContract]
class ChangeStateCommand {
  [DataMember]
  public string MyEntityId { get; set; }
  [DataMember]
  public string State { get; set; }
}

public void Process(ChangeStateCommand command) {
  var entity = this.myEntityRepository.Get(command.MyEntityId);
  if (entity == null)
   throw new SomeException().

  entity.ChangeState(command.State);
  this.myEntityRepository.Commit();
}

この場合、ChangeStateCommand で運ばれたデータは、ドメイン エンティティを操作するために使用されます。

于 2011-08-07T22:30:20.890 に答える