15

質問のタイトルはほとんど続きます: コマンドの承認はどこで確認できますか?

たとえば、顧客を優先として設定するには、次の操作が必要です。

  • 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 つのラッピング コマンドですべてのハンドラーをラップできます。

4

2 に答える 2

3

ユーザーが誤ってクリックしないように、ビューにその確認を表示するのは優れた UI です。コマンドが作成される場所があるため、コントローラーの検証を「実際の」検証と見なします。ユーザーが権限を持っていない場合、コマンドを作成 (またはそのアクションに到達することさえ) できないはずです。

ハンドラーにチェックを入れるのは、承認を行う責任がなく、ユーザーがハンドラーに直接到達できるわけではないため、少しやり過ぎだと思います。

于 2013-06-18T06:12:53.000 に答える