Ninject + Web ApI 2:使用IFilterProvider到DefaultFilterProvider的绑定激活IFilterProvider时出错

时间:2014-06-03 15:33:32

标签: ninject ninject-2 ninject-extensions

我最初使用了一些我发现的自定义代码来处理Web API中的依赖项解析,它运行正常。我遇到的问题是我想将过滤器绑定到我的控制器范围,就像使用MVC一样。例如,Kernel.BindFilter。新的Ninject.We.WebApi包具有我想要的绑定扩展名,但是只要我将它添加到我的项目中,我就会收到以下错误。我没有更改任何代码,仅引用DLL。

  

使用IFilterProvider绑定激活IFilterProvider时出错   DefaultFilterProvider在。之间检测到循环依赖   两个服务的构造者。

     

激活路径:3)将依赖关系IFilterProvider注入   参数defaultFilter类型构造函数的提供者   DefaultFilterProviders 2)注入依赖   DefaultFilterProviders到构造函数的参数filterProviders   类型DefaultFilterProvider 1)请求IFilterProvider

     

建议:1)确保您尚未声明依赖关系   IFilterProvider对服务的任何实现。 2)考虑一下   将服务组合成一个服务以消除循环。 3)使用   属性注入而不是构造函数注入,并实现   如果您需要运行初始化逻辑,则可以使用IInitializable   属性值已被注入。

     

在Ninject.Activation.Context.Resolve()处   Ninject.KernelBase。&lt;&gt; c__DisplayClass15.b__f(IBinding绑定)   在System.Linq.Enumerable.WhereSelectListIterator 2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b1 1.MoveNext()at   System.Linq.Enumerable.d__14 2.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)at at   Ninject.Web.WebApi.Filter.DefaultFilterProvider.GetFilters(HttpConfiguration   配置,HttpActionDescriptor actionDescriptor)at   System.Web.Http.Controllers.HttpActionDescriptor.b__0(IFilterProvider   fp)at   System.Linq.Enumerable.d__14 2.MoveNext() at System.Linq.Buffer 1..ctor(IEnumerable 1 source) at System.Linq.OrderedEnumerable 1.d__0.MoveNext()at   System.Linq.Buffer 1..ctor(IEnumerable 1来源)at   System.Linq.Enumerable.d__a0 1.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer 1..ctor(IEnumerable 1 source) at System.Linq.Enumerable.<ReverseIterator>d__a0 1.MoveNext()at   System.Collections.Generic.List 1..ctor(IEnumerable 1集合)
  at System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy 1.CreateValue()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Lazy`1.get_Value()at   System.Web.Http.Controllers.HttpActionDescriptor.GetFilterPipeline()
  在   System.Web.Http.Controllers.HttpActionDescriptor.GetFilterGrouping()
  在System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext   controllerContext,CancellationToken cancellationToken)at   System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage   请求,取消语音取消语言)   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()

2 个答案:

答案 0 :(得分:1)

如果其他任何人正在寻找IFilterProvider的周期性依赖解决方案,我必须像这样显式绑定DefaultFilterProviders

k.Bind<DefaultFilterProviders>().ToConstant(new DefaultFilterProviders(GlobalConfiguration.Configuration.Services.GetFilterProviders()));

或这个

k.Bind<DefaultFilterProviders>().ToSelf().WithConstructorArgument(GlobalConfiguration.Configuration.Services.GetFilterProviders());

如果其他人知道更好的方法,我很想听听。

答案 1 :(得分:0)

我明白了。我添加了Nuget包Ninject.Web.WebApi.WebHost。