あなたがあなたのドメインにそれを送るとき、あなたのコマンドは有効であると思われます。したがって、送信する前に、クライアントで検証して、フォルダがまだここにあるかどうかを確認する必要があります。それはあなたが明確なエラーメッセージで正確に何が起こっているかをクライアントに伝えることを可能にします
これにより、エラーのマージンも大幅に削減されます。何かが失敗するまでの時間枠は、ネットワーク経由でコマンドを送信する時間とサーバーでコマンドを実行する時間に短縮されます。
このリスクが本当に低い場合。ドメインからのみ失敗コマンドの回答(例: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番目のケースでは、私が話していたのかもしれません。他の場合では、検証は別として、それもかもしれません...
イタリック体のすべては個人的な試用版であり、私はそれについて何も読んでおらず、その意味で適切に機能しているものは何も完成していません。だから大きな括弧でそれを取る..彼は彼!
[/編集]