2016-05-15 170 views
11

我正在尝试使用Ninject在ASP.NET WebAPI的ActionFilters上设置DI。我跟着指示操作:https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filtersASP.NET的WebAPI ActionFilters的依赖注入使用Ninject不工作

创建我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

构建的你是如何配置注入或ApiAuthorizeFilter的参数? – DavidS

+0

@DavidS这就是我想要解决的问题。我想将IValidateApiTokenService注入到我的过滤器中。 –

+0

不知道如何实例化IValidateApiTokenService,我无法给出具体的建议,但有几个示例说明如何在示例代码中执行此操作(如果尚未查看):https: //github.com/ninject/Ninject.Web.WebApi/blob/master/src/SampleApplication/Controllers/FilterInjectionExample/FilterInjectionModule.cs – DavidS

回答

2

在您启动类

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

我从来没有在Ninject工作过,我在Unity上工作过。凭借我在Unity上的工作经验,我会尽力阐明这个问题。

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

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

你可能有一些东西一样

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

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

如果是在辛格尔顿范围。

+0

感谢您的回复。但是,我的问题特别是让Ninject的DI与ActionFilters一起工作。我的DI已经在控制器中正常工作了。 –

1

它说不起来的原因是因为ActionFilters(或者其他任何过滤器)被运行时创建为单例(一个实例永远在应用上下文中),并且一般来说任何DI容器都会遇到问题一个对象的瞬态和或一次性依赖关系,如果该对象是一个单身。

一个解决问题的方法是使用内置的服务定位器,像这样: DependencyResolver.Current.GetService(typeof(IValidateApiTokenService));

我不亲自使用Ninject我的DI的需求,但如果上面不起作用,它可能需要一些接线,在DI启动或使用一个集成包像这样的: https://github.com/ninject/ninject.web.mvc/wiki/MVC3