gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:17:06 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com