我有一个自定义的授权类,它继承自FilterAttribute并实现了IAuthorizationFilter.我正在使用最新版本的Ninject w / asp.net MVC 3支持.
我的问题是我正在使用构造函数注入来注入一个存储库.但是在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(not null).
这在下面的工作,但是我需要在控制器的范围,而不是行动.
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
当前实现的问题是它被发现一次作为过滤器属性,一旦添加为普通过滤器.一个用于这些实例将使repo注入一个repo为null为另一个.
注意:如果这简化了实现,您可以从现有的FilterAttribute派生.但是在这种情况下不要将其用作属性,而将其用作普通过滤器.