2011-09-13 4 views
1

私はasp.net mvcアプリケーションを持っており、CodeAccessSecurityAttributeを継承するいくつかのwcfエンドポイントを保護するカスタム属性を開発しています。autofacを使用して属性内で依存関係を定義する方法

私はautofacを使用して、この属性内で使用できるサービス依存性を注入する方法を見つけるのが難しいです。

[Serializable] 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public class SecuredResourceAttribute : CodeAccessSecurityAttribute 
{ 
    public ISecurityService SecurityService { get; set; } 

    public SecuredResourceAttribute(SecurityAction action) : base(action) 
    { 
    } 

    public override IPermission CreatePermission() 
    { 
     // I need access to the SecurityService here 
     // SecurityService == null :(
    } 
} 

プロパティの自動配線の登録をアプリケーションから試しましたが、これは機能しません。依存関係を属性に挿入する最良の方法は何ですか?

builder.RegisterType<SecuredResourceAttribute>().PropertiesAutowired(); 

おかげ

+0

私の疑問は、属性の限界を考えれば、これは可能ではないという疑いがある。 –

答えて

1

あなたは、このカップルの理由のためにパンするつもりはない近づいている方法:

  • あなたがautofacを使用していないと何もしないだろうautofacに属性を登録します属性をインスタンス化します。
  • 属性はコード実行前に適用されるため、定数入力に依存します。
あなたは、私はコンテナがセットアップされた後 CreatePermission()呼び出しが来ると想定していて、SecurityServiceを見つけるためにあなたの CreatePermission()メソッド内のサービス・ロケーション・パターンを使用する必要があるとしている

(とコンストラクタがない!)

ServiceLocationは、各テストのサービスロケータを設定/設定する必要があるため、クラスのテスト容易性を妨げることに注意してください。

注意

You should start your journey into ServiceLocation hereを使用しますが、正直これはあなたのデザインを疑問視するべきであるしてください。アトリビュートはあなたがそれを担当した役割に最も適していますか?おそらく、ポストシャープのようなアスペクト指向プログラミングに目を向けるべきであろう。

関連する問題