我有一个自定义授权类,它继承自 FilterAttribute 并实现 IAuthorizationFilter。我正在使用带有 asp.net MVC 3 支持的最新版本的 Ninject。
我遇到的问题是我正在使用构造函数注入(inject)来注入(inject)存储库。但是在调用 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):
Bind<IMyRepo>().To<MyRepo>().InRequestScope();
this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Controller, null).WhenControllerHas<MyAuthorizeAttribute >();
更新:
我注意到的一件事是这个过滤器处于 Controller 级别。我在操作范围内还有其他过滤器似乎可以正常工作......这可能是原因吗?
更新 2:
我已经确认,如果我将过滤器范围更改为操作,则存储库可用 OnAuthorization(非空)。
这在下面有效,但是我需要在 Controller 范围内,而不是 Action 。
this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Action, null).WhenActionMethodHas<MyAuthorizeAttribute >();
最佳答案
属性不支持构造函数注入(inject),因为它们是由 .NET Framework 创建的,不受 Ninject 控制。如果您真的想使用 FilterAttribute(我不推荐),您将不得不使用属性注入(inject)。
而是继续你刚刚开始的事情。您需要一个实现 IAuthorizationFilter 的过滤器(不是从 FilterAttribute 派生的,只需将其从上面的代码中删除)以及一个用于标记 Controller /操作的普通属性。
然后更改绑定(bind):
this.BindFilter<MyAuthorizeFilter>(FilterScope.Controller, 0).WhenControllerHas<MyAuthorizeAttribute>();
见:https://github.com/ninject/ninject.web.mvc/wiki/MVC3
您当前实现的问题在于,它曾经作为过滤器属性被发现,并且曾经作为普通过滤器添加。这些实例的一个将注入(inject) repo ,而另一个 repo 为空。
注意:如果这简化了您的实现,您可以从现有的 FilterAttribute 派生。但是在这种情况下不要将其用作属性,而是将其用作普通过滤器。
关于asp.net-mvc - 自定义授权 MVC 3 和 Ninject IoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5572257/