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

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 自定义授权MVC 3和Ninject IoC前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个自定义的授权类,它继承自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派生.但是在这种情况下不要将其用作属性,而将其用作普通过滤器.

猜你在找的asp.Net相关文章