6

Command Query Responsibilty Separation に関する Greg Young と Udi Dahan の考えを読んでいて、読んだ内容の多くが心に響きました。私のドメイン (配達を行っている車両を追跡しています) には、1 つ以上のストップを含むルートの概念があります。顧客が Web サービスを呼び出してシステムでこれらを設定できるようにし、ルートと車両の進行状況に関する情報を取得できるようにする必要があります。

以前は、ドメイン クラスに非常によく似た「カットダウン」DTO クラスがあり、顧客は StopDto の配列を使用して RouteDto を作成し、CreateRoute Web メソッドを呼び出して RouteDto を渡していました。彼らが GetRouteDetails メソッドを呼び出してシステムにクエリを実行すると、まったく同じオブジェクトが返されます。CQRS の魅力的な側面の 1 つは、RouteDto には、顧客が照会したいあらゆる種類のプロパティが含まれる可能性があるが、Route を作成するときにビジネス設定がないことです。そのため、CreateRoute「コマンド」を呼び出すときに渡される CreateRouteRequest クラスと、クエリ結果として返される Route DTO クラスを個別に作成します。

class Route{
    string Reference;
    List<Stop> Stops;
}

しかし、顧客がルートを作成するときに、ルートとストップの詳細を提供してもらう必要があります。私が見たとき、私はどちらかをすることができました...

CreateRouteRequest クラスに、各停留所について提供する必要があるデータを表す「何か」の配列である Stops(s) プロパティを指定しますが、このクラスを何と呼ぶのでしょうか? Route DTO 内の DTO のリストと呼んでいるので、これは Stop ではありませんが、「CreateStopRequest」は好きではありません。また、ここで CRUD の考え方にとらわれていて、マスター/詳細情報の観点から考え、顧客にもそのように考えるよう求めているのではないかと思います。

class CreateRouteRequest{
    string Reference;
    ...
    List<CreateStopRequest> Stops;
}

また

CreateRoute を呼び出してから、AddStopToRoute メソッドを何度も呼び出します。これはもう少し「行動的」に感じますが、ストップを含むルートの作成を単一のアトミック コマンドとして扱う能力を失うことになります。ルートを作成してからストップを追加しようとすると、検証の問題が原因で失敗し、部分的に正しいルートになります。

オプション 1 で使用する "StopCreationData" オブジェクトのリストに適切な名前を付けられないという事実は、何かが欠けているのではないかと考えさせられます。

4

3 に答える 3

6

これが非常に古い投稿であることは認識していますが、最近、いくつかの同様のパターンに取り組んでおり、このスレッドに貢献する必要があると感じています. OP が切断感を感じていた原因の 1 つは、設計をドメインに適合させるのではなく、ドメイン用語を独自の運用言語に押し込んでいたことだと思います。

ヒントは、動詞としての「作成」の使用にあります。私が見つけた「作成」は、開発者の頭の中では「挿入」と同じであり (「CRUD」と考えてください)、DDD を初めて試すときは、あまり技術的ではないように思われるため、この動詞に頼ることがよくあります。ただし、ここで「作成」されているルートは既に存在します。それらは単にシステムに記録されているだけです。同じ路線に沿って、ルート上の停留所は既に存在しますが、同様に記録されています。おそらく、RecordRouteCommand をオプションの付随する RecordStopOnRouteCommand のコレクションと共に使用することによって、認識と言葉遣いを単純に変更するだけで、おそらく混乱は少し解消されたでしょう。記録停止コマンドを独立して送信できるようにすると、構築の柔軟性が向上し、API が強化されます。

また、リクエストとコマンドについては Szymon に同意します。その言い回しも、cqrs のアプローチに反する考え方につながります。DDD が私に教えてくれたことが 1 つあるとすれば、プロジェクトで使用する言葉は単に重要であるだけでなく、最も重要であるということです。

于 2014-04-03T00:54:17.380 に答える
5

私はあなたが何かを逃しているとは思わない。

class CreateRouteRequest{
    string Reference;
    ...
    List<CreateStopRequest> Stops;
}

私には問題ないようです。私の意見では、 AddStopToRoute を使用する代替手段は、リモートで効率的に呼び出すにはあまりにも「おしゃべりな」インターフェイスを作成するため、良い考えではありません。

于 2010-06-24T08:41:32.633 に答える
2

ただし、CreateRoute* Request * の使用は、Request/Response パターンを使用していることを示しているようです。

本当にサーバーにコマンドを送信している場合、サーバーは Response オブジェクト/メッセージを返すべきではありません。サービスに ExecuteCommand メソッドを公開させ、それを呼び出して、CreateRouteCommand を渡すことができます。

Request/Response は適切な CQRS IMHO ではありません。

于 2011-03-17T13:25:21.453 に答える