Asp.net-Mvc

自定義授權 MVC 3 和 Ninject IoC

  • January 17, 2014

我有一個自定義授權類,它繼承自 FilterAttribute 並實現 IAuthorizationFilter。我正在使用帶有 asp.net MVC 3 支持的最新版本的 Ninject。

我遇到的問題是我正在使用建構子注入來注入儲存庫。但是在呼叫 OnAuthorization 時,儲存庫為空。這是程式碼…

public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
   {
       private readonly IMyRepo _MyRepo;

       public MyAuthorizeAttribute() { }
       public MyAuthorizeAttribute(IMyRepo myRepo)
       {
           _MyRepo= myRepo; //this gets initialized
       }


       public void OnAuthorization(AuthorizationContext filterContext)
       {
           _MyRepo.DoStuff(); //<< Null, wtf

       }
   }

過濾器綁定:

Bind<IMyRepo>().To<MyRepo>().InRequestScope();


this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Controller, null).WhenControllerHas<MyAuthorizeAttribute >();

更新: 我注意到的一件事是這個過濾器處於控制器級別。我在操作範圍內還有其他過濾器似乎可以正常工作……這可能是原因嗎?

更新 2: 我已經確認,如果我將過濾器範圍更改為操作,則儲存庫可用 OnAuthorization(非空)。

這在下面有效,但是我需要在控制器範圍內,而不是動作。

this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Action, null).WhenActionMethodHas<MyAuthorizeAttribute >();

屬性不支持建構子注入,因為它們是由 .NET Framework 創建的,不受 Ninject 控制。如果您真的想使用 FilterAttribute(我不推薦),您將不得不使用屬性注入。

而是繼續你剛剛開始的事情。您需要一個實現 IAuthorizationFilter 的過濾器(不是從 FilterAttribute 派生的,只需將其從上面的程式碼中刪除)以及一個用於標記控制器/操作的普通屬性。

然後更改綁定:

this.BindFilter<MyAuthorizeFilter>(FilterScope.Controller, 0).WhenControllerHas<MyAuthorizeAttribute>();

見:https ://github.com/ninject/ninject.web.mvc/wiki/MVC3

您目前實現的問題在於,它曾經作為過濾器屬性被發現,並且曾經作為普通過濾器添加。這些實例的一個將注入回購,而另一個回購為空。

注意:如果這簡化了您的實現,您可以從現有的​​ FilterAttribute 派生。但是在這種情況下不要將其用作屬性,而是將其用作普通過濾器。

引用自:https://stackoverflow.com/questions/5572257