2017-12-13 11 views
-2

MVCでアクションフィルタを作成していて、ActionFilterAttributeクラスから継承する新しいアトリビュートを作成し、OnActionExecutedメソッドを実装しました。それから、私はこの新しい属性でアクションを装飾しました。私が最初にアクションを呼び出すと、すべてが問題なく、AttributeのコンストラクタがOnActionExecutedメソッドと呼ばれます。この同じアクションを2度目に呼び出すと、Attributeのコンストラクタが呼び出されず、Actionの最初の呼び出しで設定された内部属性メンバーの状態がまだ保持されていることがわかります。属性のインスタンスは、アクションへのすべての呼び出しに使用されます。各属性呼び出しに新しいインスタンスを強制する方法はありますか?複数のメソッド呼び出しに同じアトリビュートが使用されています

+3

コンストラクタは初めてアトリビュートを構築するために呼び出されます。アトリビュートは既に構築されているため、再度アクセスされることはなく、静的コンストラクタと同じように動作します。 これは推測ですが、コードを入力してください。 – Nekeniehl

+0

いくつかのコードを提供できますか?正確に何を達成したいのか、どこに止まっているのか想像するのは難しいです。 – HimBromBeere

答えて

2

タイプ、メンバー、パラメータなどにアトリビュートをアタッチするときは、アトリビュートターゲットのメタデータに注釈を付けます。あなたの場合、メソッドに属性を適用するので、メタデータレベルでメソッドにアタッチされ、メソッドが呼び出されるインスタンスにはアタッチされません。つまり、メソッドを適用するメソッドごとに新しい属性インスタンスを取得し、ターゲットメソッドが定義されているクラスのインスタンスごとに新しいインスタンスを取得することはできません。

メタデータには変更可能な状態がないため、正しく使用されていれば、属性も変更されません。属性の働きを変更することはできないので、内部状態に依存しない方法で属性を実装する必要があります。

関連する問題