asp.net-mvc - 自定义授权 MVC 3 和 Ninject IoC

标签 asp.net-mvc asp.net-mvc-3 ninject

我有一个自定义授权类,它继承自 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/

相关文章:

javascript - Asp MVC 应用程序逐渐变慢,因为 datatables.net 表在 ajax 成功时重新绘制

javascript - angularjs以json格式将数据发送到mvc Controller

javascript - ASP.NET MVC - 返回 JavaScriptResult 不起作用

asp.net-mvc - MVC : The model item passed into the dictionary is of type X, 但该字典需要 X 类型的模型项

entity-framework - Ninject WebAPI 操作无法完成,因为 DbContext 已被释放

c# - 我们可以在 ASP.NET MVC 应用程序中更改操作方法名称吗?

c# - 将 WebImage 上传到 FTP

c# - 如何制作等同于@Ajax.DropDownList?

ninject - 在 Ninject 中调用所有 ISomething 实例

asp.net-mvc - 将 ninject 与 Ninject.Web.Api 用于 Web Api 2 一起使用在 ASP.NET MVC 5 中不起作用