我正在尝试使用Ninject在ASP.NET WebAPI中设置ActionFilters上的DI。我按照这里的说明进行操作:https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filters
我像这样创建我的ActionFilter:
public class ApiAuthorizeFilter : AbstractActionFilter
{
private readonly IValidateApiTokenService _validateApiTokenService;
public ApiAuthorizeFilter(IValidateApiTokenService validateApiTokenService)
{
_validateApiTokenService = validateApiTokenService;
}
public override bool AllowMultiple => true;
public override void OnActionExecuting(HttpActionContext actionContext)
{
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
}
}
我这样配置:
kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller);
根据上述链接的信息,我的理解是ActionFilter应该运行所有WebAPI控制器中的所有Actions。但是,我在过滤器中的两个重写方法中都设置了断点,它永远不会被击中。我在配置中设置了一个断点,可以确认它正在执行。
我错过了什么?我需要这个ActionFilter来运行我项目中每个ApiController中的所有Actions。
答案 0 :(得分:3)
在您的启动类
中public void Configuration(IAppBuilder app)
{
var kernel = new StandardKernel();
// register IValidateApiTokenService
var config = new HttpConfiguration();
config.Filters.Add(new ApiAuthorizeFilter(kernel.Get<IValidateApiTokenService>());
}
答案 1 :(得分:1)
它之所以不起作用的原因是因为ActionFilters(或任何过滤器)由运行时创建为单例(永远在应用程序上下文中的一个实例),并且通常任何DI容器都会出现问题。如果该对象是单个对象,则为对象的瞬态和/或一次性依赖。
您的问题的一个解决方案是使用内置服务定位器,如下所示:
DependencyResolver.Current.GetService(typeof(IValidateApiTokenService));
我个人并不亲自使用Ninject来满足我的DI需求,但如果上述方法不起作用,可能需要在DI启动时进行一些连接或使用像这样的集成包: https://github.com/ninject/ninject.web.mvc/wiki/MVC3
答案 2 :(得分:0)
我从未在Ninject工作,我曾在Unity工作过。凭借我在Unity上工作的经验,我将尝试阐明这个问题。
我不确定_validateApiTokenService
的目的是什么,但我可以从上面的代码中观察到的是你必须配置将依赖项绑定到实现IValidateApiTokenService
。以及以下代码
kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller);
你可能需要做一些像
这样的事情kernel.Bind<IValidateApiTokenService>().To<ValidateApiTokenService>();
或
kernel.Bind<IValidateApiTokenService>.To<ValidateApiTokenService>().InSingletonScope();
如果是在Singleton范围内。