Asp.net-Mvc
自定義授權 MVC 3 和 Ninject IoC
我有一個自定義授權類,它繼承自 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 派生。但是在這種情況下不要將其用作屬性,而是將其用作普通過濾器。