2012-03-15 11 views
3

私はCQRSの指揮部の設計についていくつかの考えを持っています。私は自分の考えをあなたの意見を聞きたい。前もって感謝します! :)CQRS:ICommandExecutor.Execute()メソッドで結果を返すのは良いですか?

CQRSには、コマンドとCommandExecutorsがあります。場合によっては、コマンド実行プログラムが実行完了後に結果を返すようにしたい場合もあります。可能な解決策の1つは、(C#):

public interface ICommandExecutor<TCommand> 
{ 
    void Execute(TCommand cmd); 
} 

public interface ICommandExecutor<TCommand, TResult> 
{ 
    TResult Execute(TCommand cmd); 
} 

これまでのところ良いです。 2つのコマンド実行インタフェースを使用します。クライアントコードを見てみましょう:

var cmd = new MyCommand(); 
commandBus.Execute(cmd); // execute no result 
commandBus.Execute<MyResult>(cmd); // execute result 

はい、私たちは今すぐexeuctorに結果を返させることができます。しかし、プログラマは、上記のコードを書くときに混乱するかもしれません:このコマンドは実行されるかどうか?答えを得るために、プログラマーは、MyCommandExecutorかMyCommandExecutorがあるかどうかを見るためにフレームワークのソースコードを調べる必要があります。これは悪いです!とても混乱するような!

私の意見では、DELETEICommandExecutor<TCommand, TResult>です。 つまり、私はコマンド実行者は常にvoidを返すべきだと思います。 ICommandExecutor<TCommand, TResult>のデザインが悪いです!

コマンド実行後に何が変更されるかを確認する必要がある場合。 commandBus.Execute(cmd)を呼び出した後、データベースに新しいクエリを作成する必要があります。

あなたはどう思いますか?

答えて

7

を取得するために別のコマンド(クエリ)を使用する必要があります。戻り値を持つことがCQRSのコマンドに適しているかどうかはわかりませんが、時々私のコマンドでこれを行います(しかし、私はCQRSに従っていません)。しかし、2番目のインタフェースを持つよりも、出力プロパティをコマンドに追加してください。

public class CreateCustomerCommand 
{ 
    // customer properties here 

    // output property 
    public Guid CustomerId { get; internal set; } 
} 

出力プロパティを持つコマンドは、決して非同期に実行できないことに注意してください。

戻り値を持つエグゼキュータインタフェースを実際に使用したい場合(私はアドバイスしません)、this articleを見てください。この記事では、SOLIDの方法でクエリを実装する方法について説明しますが、データを返すことができる型セーフなインターフェイスを定義するという問題を扱います。

上記の例では、CustomerIdプロパティを入力プロパティにすることで、コマンドを簡単に非同期にすることができます。クライアントに新しいランダムGuidを提供させます。このようにして、クライアントはすでにIDを取得しており、結果が利用可能になるのを待つ必要はありません。

+3

"出力プロパティ"はかなり良い解決策です。ありがとう!ところで、私もフリーランスです;) –

4

厳密に言えば、コマンドパターンを使用している場合、何も返されませんが、常にvoidである必要があります。あなたは、あなたが第2のインタフェースを追加するべきではありません任意のデータ

http://www.dofactory.com/Patterns/PatternCommand.aspx#_self1

+1

[query](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92)を使用してデータを取得する必要があります。 – Steven

+0

それは私が意味するものです。私は私の答えを編集しました –

6

CQRSでは、パターンの解剖学的構造を破壊するため、コマンド側は何も返さないでください。これに関する自分の考えは正しい。

しかし、Greg Youngは、コマンド操作のAck/Nack結果をよく言及しています(または、とにかく使用されます)。ほとんどのメッセージングフレームワークはそのような応答をサポートしています。結果が期待できる欠点は、完全に非同期にすることができないことです。Ack/Nackの必要性を感じたことはありません.CQRSの基本の1つはコマンドが常に成功してAck/Nackを返すことができないということです。

あなたが返す必要があるものを自分に尋ねます。送信/指揮側にまだ持っていない情報を返すためには、どのような操作が必要ですか?あなたのコマンドがクエリになる前に、それを理解する時間をかけてください。

関連する問題