繁体   English   中英

使用Ninject的ASP.NET WebAPI ActionFilters的依赖注入不起作用

[英]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);

基于上述链接的信息,我的理解是ActionFilter然后应该运行所有WebAPI控制器中的所有Actions。 但是,我在过滤器中的两个重写方法中都设置了断点,它永远不会被击中。 我在配置中设置了一个断点,可以确认它正在执行。

我错过了什么? 我需要这个ActionFilter来运行我项目中每个ApiController中的所有Actions。

在您的启动类中

public void Configuration(IAppBuilder app)
{    
    var kernel = new StandardKernel();
    // register IValidateApiTokenService
    var config = new HttpConfiguration();
    config.Filters.Add(new ApiAuthorizeFilter(kernel.Get<IValidateApiTokenService>());
}

每个人说不起作用的原因是因为ActionFilters(或任何过滤器)由运行时创建为单例(永远在应用程序上下文中的一个实例),并且通常任何DI容器在连接对象的瞬态和或者一次性依赖项,如果该对象是单例。

您的问题的一个解决方案是使用内置服务定位器,如下所示: DependencyResolver.Current.GetService(typeof(IValidateApiTokenService));

我不亲自使用Ninject来满足我的DI需求,但如果上述功能不起作用,可能需要在DI启动时进行一些连接或使用像这样的集成包: https//github.com/ninject/ninject。 web.mvc /维基/ MVC3

我从未在Ninject工作,我在Unity工作。 凭借我在Unity上工作的经验,我将尝试阐明这个问题。

我不确定_validateApiTokenService的目的是_validateApiTokenService ,但我从上面的代码中观察到的是你必须配置将依赖项绑定到实现IValidateApiTokenService 以下代码

kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller);

你可能需要有一些东西

kernel.Bind<IValidateApiTokenService>().To<ValidateApiTokenService>();

要么

kernel.Bind<IValidateApiTokenService>.To<ValidateApiTokenService>().InSingletonScope(); 

如果它是在Singleton范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM