2011-01-05 14 views
0

メソッドで使用されているAttributeクラスをUnityを介して注入できるかどうか知りたいのですか?Unity - 属性クラスを挿入する

より正確には、私が取り組むプロジェクトは、コントローラインスタンスがUnityを介して注入されているMVC2 ASP.NETタイプです。 DBコンテキストなどのすべての依存関係は、Unity設定ファイルで設定されます。

私の質問は、DB Contextを使用するカスタム属性クラスを挿入するにはどうすればいいですか?つまり、依存関係がありますか?助けを事前に

public class MyController : Controller 
    { 
     public IDBContext MyDBContext { get; set; } 
... 

    [CustomAuthorize] 
    public ActionResult Index() 
    { 
... 

    public class CustomAuthorize : AuthorizeAttribute 
    { 
     public IDBContext2 MyDBContext2 { get; set; } 
... 

ありがとう:

はここで、コントローラクラスの抽象的です。

N.

答えて

0

それは完全に不可能ではないのですが、それは非常に困難です。

問題は、属性オブジェクト自体がCLR(特にリフレクションAPIを正しく理解している場合)によって作成されるため、そこにコンテナを呼び出すコンテナを取得する方法がないことです。アトリビュートインスタンスが作成されたときにを実際に制御することはできません。したがって、コンテナの準備ができているかどうかを保証することさえできません。

属性をスピンし、それぞれのBuildUpを呼び出して、それをMVCパイプラインにプラグインするカスタムActionInvokerを書くことができます。しかし、それは難しい作業です。

Jimmy Bogard has a series on getting more DI into an MVC appのリンクは、アクションフィルタの特定のトピックを指します。あなたが行う必要がありますどのような

1

は、あなたのCustomAuthorizeがMicrosoft.Practices.Unity.InterceptionExtension.HandlerAttributeから を継承し、 「ICallHandlerのcreateHandler(IUnityContainerコンテナ)」メソッドをオーバーライド属性にすることです。

public class CustomAuthorizeAttribute: HandlerAttribute 
{ 
    public IAuthorizeAttributeHandler AuthorizationHandler { get; set; } 

    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     AuthorizationHandler= new AuthorizationAttributeHandler 
    { 
     DBContext = container.Resolve<IDBContext>() 
    }; 
    return AuthorizationHandler; 
    } 
} 

は今Microsoft.Practices.Unity.InterceptionExtension.ICallHandlerから派生インターフェイスを作成し、メンバーとして、あなたのIDBContext を追加します。あなたの団結の構成に

public interface IAuthorizeAttributeHandler : ICallHandler 
{ 
IDBContext DBContext; 
} 

IAuthorizationAttributeHandler実装

public class AuthorizationAttributeHandler : IAuthorizeAttributeHandler 
{ 
public IDBContext DBContext 
     { 
      get; set; 
     } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     var result = DBContext.DoWork(input.Arguments..); 

//// Invoke the handler 
      IMethodReturn output = getNext()(input, getNext); 

return getNext()(input, getNext); 
    } 
} 

シンプルな傍受の拡張子を追加します。

unityContainer 
       .AddNewExtension<Interception>() 
       .Configure<Interception>() 
       .SetInterceptorFor<IYourPageInterface>(new InterfaceInterceptor()); 

アスペクトを実行したいインターフェイスメソッドに属性を追加しました。

[CustomAuthorize] 
     ActionResult Index() 
     { 
    } 

希望これは 乾杯 Rustin

を支援
関連する問題