加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 20:09:11 所属栏目:asp.Net 来源:网络整理
导读:我有一个自定义的授权类,它继承自FilterAttribute并实现了IAuthorizationFilter.我正在使用最新版本的Ninject w / asp.net MVC 3支持. 我的问题是我正在使用构造函数注入来注入一个存储库.但是在OnAuthorization被调用的时候,存储库是空的.这是代码… public
我有一个自定义的授权类,它继承自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派生.但是在这种情况下不要将其用作属性,而将其用作普通过滤器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读