使用 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>());
}