1

以下を実装するためのより良い方法があるかどうか、私は非常に興味があります。複雑な、または保守不可能なコードを作成したくありません。

将来のプロジェクトで実装されるクラス ライブラリを作成しています。このライブラリには、ActionFilterAttribute から継承されたいくつかのフィルター/属性が含まれており、実装アプリケーションがコントローラーまたはアクションを装飾するために使用できます。

例は MustBeLoggedInAttribute です。これは、Cookie をチェックして、現在のユーザーがログインしているかどうかを確認します。有効な Cookie がある場合、アクションは実行されません。有効な Cookie がない場合、属性はコントローラーとアクション (AuthController > Login() など) にリダイレクトします。

そのため、クラス ライブラリを実装するアプリケーションがあるため、アプリケーションがどのコントローラーまたはアクションにリダイレクトしたいのかわかりません。この情報を得るために、私は 2 つの方法を考えました。

  1. 実装アプリを取得して、その web.config でコントローラーとアクション名を指定します。

    実装するアプリのアセンブリに両方が存在することを確認して文字列名を検証します。それ以外の場合は、Home > Index() などの既定値を試します。この方法には、次のような多くの短所があるようです

    • 実装アプリケーションの保守性を低下させます (コントローラーまたはアクション名を変更すると、Web 構成も更新されます)

    • 文字列名を検証する必要があります

    • 実装アプリの開発者は、これを指定するためにドキュメントを読む必要があります

    • おそらくもっとたくさんあります

  2. コントローラーとアクションを指定するために、フィルター/属性に 2 つのパラメーターを使用させます。

    これには、名前が変更された場合に名前を更新するなど、最初のアイデアのいくつかの落とし穴があるようですが、実装アプリケーション全体で名前が重複するという事実もあります。

これを行うには、実装するアプリを保守しやすくし、コードを複製せず、複雑すぎないようにする、より良い方法が必要だと感じています。それは希望的観測ですか?

フィルターはどこにリダイレクトするかを知る必要がありますが、それを行う最善の方法は何でしょうか? それとも、まったく別の方法でこれを行う必要がありますか? 実装アプリケーションは独自のフィルター/属性を実装し、クラス ライブラリのパブリック メソッドを使用して Cookie チェックを行う必要がありますか? もっと良い方法はありますか?

私は本当に悪いコードを作成したくないので、これについて人々の考えを本当に感謝しています. どうもありがとう!

4

2 に答える 2

2

アクション フィルターを抽象化し、フィルター コンテキストを取得する HandleUnauthorizedRequests 抽象メソッドをいくつか持つことができます。これで、実装アプリケーションは基本アクション フィルターを取得し、抽象メソッドを実装する派生フィルターを作成し、代わりにこのクラスを使用します。このメソッドでは、必要なことは何でもできます->リダイレクト、ビューのレンダリング...

もちろん、アカウント/ログオン アクションへのリダイレクトなど、標準的な従来のものを備えたデフォルトの実装を提供することもできます。この従来のものをオーバーライドしたい人は、いつでもそれを行うことができます. このように、クラス ライブラリの作成者は、コントローラーが存在するかどうかを心配する必要はありません。これは、コンシューマーの責任です。

于 2013-10-15T12:01:53.607 に答える
1

古い質問ですが、ここにいくつかの新しい選択肢があります:

オプション 2 を使用しますが、各アクションに個別に適用する代わりに、基本コントローラーを作成し、そのコントローラーにフィルターを適用します。次に、そのコントローラーと派生物のすべてのアクションがフィルターを通過する必要があります。フィルター処理された基本コントローラーから派生していない別のコントローラーに渡す必要のないアクションを配置します。アクション/ルートなどをどのように整理するかによってはオプションではないかもしれませんが、おそらく最も簡単です.

または、MustBeLoggedInException などのカスタム例外をフィルターで発生させ、グローバル asax で各アプリケーション/実装に必要な方法でそのエラーを具体的に処理することもできます。単一責任原則の遵守: 属性は、フィルターを通過していないことをアプリに通知するだけです。次に、他のメカニズムを使用してその情報を処理します (たとえば、グローバル エラー ハンドラでのリダイレクト)。

于 2014-03-31T13:49:16.517 に答える