使用 Ninject 的 ASP.NET Web API 操作过滤器的依赖注入不起作用
Dependency Injection for ASP.NET WebAPI ActionFilters using Ninject not working
我正在尝试使用 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);
我根据上述信息 link 的理解是,ActionFilter 应该 运行 用于所有 WebAPI 控制器中的所有操作。但是,我在过滤器中的两个重写方法都设置了断点,它永远不会被命中。我在配置下了断点,可以确认正在执行
我错过了什么?我需要这个 ActionFilter 运行 我项目中每个 ApiController 中的所有 Actions。
我从未在 Ninject 上工作过,我在 Unity 上工作过。根据我在 Unity 上的工作经验,我将尝试阐明这个问题。
我不确定 _validateApiTokenService
的目的是什么,但我可以从上面的代码观察到的是,您必须配置以将依赖项绑定到实现 IValidateApiTokenService
。连同以下代码
kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller);
你可能需要像
这样的东西
kernel.Bind<IValidateApiTokenService>().To<ValidateApiTokenService>();
或
kernel.Bind<IValidateApiTokenService>.To<ValidateApiTokenService>().InSingletonScope();
如果它在单例范围内。
据说它不起作用的原因是因为 ActionFilters(或与此相关的任何过滤器)由运行时创建为单例(一个实例永远在应用程序上下文中)并且通常任何 DI 容器都存在接线问题如果该对象是单例,则增加该对象的瞬态和/或一次性依赖项。
您的问题的一个解决方案是像这样使用内置服务定位器:
DependencyResolver.Current.GetService(typeof(IValidateApiTokenService));
我个人并不使用 Ninject 来满足我的 DI 需求,但如果上述方法不起作用,则可能需要在 DI 启动中进行一些连接或使用像这样的集成包:
https://github.com/ninject/ninject.web.mvc/wiki/MVC3
在您的启动中 Class
public void Configuration(IAppBuilder app)
{
var kernel = new StandardKernel();
// register IValidateApiTokenService
var config = new HttpConfiguration();
config.Filters.Add(new ApiAuthorizeFilter(kernel.Get<IValidateApiTokenService>());
}
我正在尝试使用 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);
我根据上述信息 link 的理解是,ActionFilter 应该 运行 用于所有 WebAPI 控制器中的所有操作。但是,我在过滤器中的两个重写方法都设置了断点,它永远不会被命中。我在配置下了断点,可以确认正在执行
我错过了什么?我需要这个 ActionFilter 运行 我项目中每个 ApiController 中的所有 Actions。
我从未在 Ninject 上工作过,我在 Unity 上工作过。根据我在 Unity 上的工作经验,我将尝试阐明这个问题。
我不确定 _validateApiTokenService
的目的是什么,但我可以从上面的代码观察到的是,您必须配置以将依赖项绑定到实现 IValidateApiTokenService
。连同以下代码
kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller);
你可能需要像
这样的东西kernel.Bind<IValidateApiTokenService>().To<ValidateApiTokenService>();
或
kernel.Bind<IValidateApiTokenService>.To<ValidateApiTokenService>().InSingletonScope();
如果它在单例范围内。
据说它不起作用的原因是因为 ActionFilters(或与此相关的任何过滤器)由运行时创建为单例(一个实例永远在应用程序上下文中)并且通常任何 DI 容器都存在接线问题如果该对象是单例,则增加该对象的瞬态和/或一次性依赖项。
您的问题的一个解决方案是像这样使用内置服务定位器:
DependencyResolver.Current.GetService(typeof(IValidateApiTokenService));
我个人并不使用 Ninject 来满足我的 DI 需求,但如果上述方法不起作用,则可能需要在 DI 启动中进行一些连接或使用像这样的集成包: https://github.com/ninject/ninject.web.mvc/wiki/MVC3
在您的启动中 Class
public void Configuration(IAppBuilder app)
{
var kernel = new StandardKernel();
// register IValidateApiTokenService
var config = new HttpConfiguration();
config.Filters.Add(new ApiAuthorizeFilter(kernel.Get<IValidateApiTokenService>());
}