1

CQRSのコマンドは失敗しないように設計されており、本質的に非同期である必要があることを読みました。

私の場合、ユーザーがビデオコンテンツの場所を表すフォルダーを持ち、各子がビデオ/メディアファイルであるツリー(Windowsエクスプローラーを考えてください)があります。複数のユーザーがツリーの同じブランチで作業して、フォルダーとファイルを移動することができます(そして、新しいファイルのアップロードと新しいフォルダーの作成、およびファイル/フォルダーの削除)。

コマンドの非同期性を無視していた場合、最初のユーザーに変更を加えさせ、ユーザーがビデオを移動しているフォルダーがもう存在しない場合は、2番目のユーザーに例外を発生させることができます。ツリーの一部を更新してから変更を再適用するのは、2番目のユーザーの責任です。

変更が許可されていない場合(つまり、ビデオファイルを別のフォルダーに移動しようとし、別のユーザーがフォルダーを削除したか、別の場所に移動した場合)にインスタントフィードバックが必要な場合、CQRSでこれを行うにはどうすればよいですか?

4

1 に答える 1

1

あなたがあなたのドメインにそれを送るとき、あなたのコマンドは有効であると思われます。したがって、送信する前に、クライアントで検証して、フォルダがまだここにあるかどうかを確認する必要があります。それはあなたが明確なエラーメッセージで正確に何が起こっているかをクライアントに伝えることを可能にします

これにより、エラーのマージンも大幅に削減されます。何かが失敗するまでの時間枠は、ネットワーク経由でコマンドを送信する時間とサーバーでコマンドを実行する時間に短縮されます。

  • このリスクが本当に低い場合。ドメインからのみ失敗コマンドの回答(例:enum)を受け取る場合があります。ユーザーにとっては、一般的な例外メッセージが表示される可能性があり、そのデータを実現して、状況が異なり、意図したとおりに実行できないことを示すことができます。このような割合の低いメッセージは、1年に2〜3回しか発生しないのであれば、大きな問題にはならないでしょう。

  • このリスクが非常に高い場合、またはクライアントからの検証が不可能であるが、ドメイン側でのみ発生する必要がある場合は、現時点で回答することはできません。私自身がCQRSを学んでいますが、これ以上は言えません。

お役に立てば幸いです。

[編集]

コマンド処理は非同期ではないと仮定しました。もしそうなら、私はコマンドの実行中に例外をキャッチしようとします、そしてそれがクライアントに正確に何であるかを言わずにいくつかの失敗通知を返すことができます。非同期のままであるさまざまなreadmodelへの投影。

 public void Handle(ICommand command)
        {
            try
            {
                CommandService.Execute(command);

                Bus.Return(ErrorCodes.None);
            }
            catch (Exception e)
            {
                Bus.Return(ErrorCodes.Fail);
            }
        }

私のCommandServiceDelegateは、仕事をするための適切なエグゼキュータです:

Public class TheGoodExecutor{
      protected void Execute(IUOW context, MyCommand command)
        {
            var myDomainObject= context.GetById<DomainObjecType>(command.Id);

            myDomainObject.DoStuff(Command.Data);

            // Accept all the work we just did.
            context.Accept();
        }
}

優れたエグゼキュータがエラーになった場合は、Bus.Return(ErrorCodes.Fail);

そして、これは同期的または非同期的にクライアントが受信できます。

完全に非同期にしたい場合(それが私がやろうとしていること、または少なくともその方法を探求したい場合)、クライアントが興味を持っている可能性のあるイベントのサブスクライブを試みます。ほとんどの場合、イベントはあまり意味がありません。しかし、2番目のケースでは、私が話していたのかもしれません。他の場合では、検証は別として、それもかもしれません...

イタリック体のすべては個人的な試用版であり、私はそれについて何も読んでおらず、その意味で適切に機能しているものは何も完成していません。だから大きな括弧でそれを取る..彼は彼!

[/編集]

于 2012-04-12T09:53:53.427 に答える