質問のタイトルはほとんど続きます: コマンドの承認はどこで確認できますか?
たとえば、顧客を優先として設定するには、次の操作が必要です。
MarkAsPreferred
コントローラー アクション (Winforms など);SetCustomerAsPreferredCommand
;SetCustomerAsPreferredCommandHandler
;Customer.MarkAsPreferred()
(ドメイン);
承認を確認する 3 つの場所を特定しました。
- 表示目的のUI (ユーザーがアクセス権を持っていない場合、リンク/ボタンは表示されません)。
- ユーザーがそのコマンドを呼び出す権限を持っていることを確認するためのコントローラー アクション。コマンドは常に成功すると想定されており(検証に関してですが、承認も想定しています)、アクセスの欠如についてユーザーに通知する機会があります。
- ドメイン ロジックを呼び出す直前のコマンド内。
SomeView.cshtml
if (authorizationService.Authorize("MarkCustomerAsPreferred))
{
// show link
}
カスタマーコントローラー
[HttpPost]
public ActionResult MarkAsPreferred(Guid id)
{
if (!authorizationService.Authorize("MarkCustomerAsPreferred))
{
return RedirectToAction("Unauthorized");
}
var MarkCustomerAsPreferredCommand { Id = id };
...
}
MarkCustomerAsPreferredCommandHandler
public void Handle(MarkCustomerAsPreferredCommand command)
{
if (!authorizationService.Authorize("MarkCustomerAsPreferred"))
{
throw new Exception("...");
}
customer.MarkAsPreferred();
}
私の質問は: 3 か所で承認を確認する必要がありますか、それとも熱心すぎるだけですか?
インターネット全体を検索しましたが、これに関する例や参照は見つかりませんでした。
編集
さらに調査し、いくつかのテストを行った結果、Dennis Taub が提案したように、コマンドをラップして動作 (承認、検証、ログ記録) を追加する方が、実装が簡単でクリーンであると思います。
この概念を正確に説明しているこのブログ投稿を見つけました。
1 つのコマンドに対して複数のハンドラーを使用することについては、元のコマンドごとに動作ごとに 1 つのコマンド ハンドラーを実装する必要はありません。1 つのラッピング コマンドですべてのハンドラーをラップできます。