我最初使用了一些我发现的自定义代码来处理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。<> 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__142.MoveNext() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection)
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
at System.Linq.Enumerable.ToList[TSource](IEnumerable2.MoveNext() at System.Linq.Buffer
1..ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable
1.d__0.MoveNext()at System.Linq.Buffer1..ctor(IEnumerable
1来源)at System.Linq.Enumerable.d__a01.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer
1..ctor(IEnumerable1 source) at System.Linq.Enumerable.<ReverseIterator>d__a0
1.MoveNext()at System.Collections.Generic.List1..ctor(IEnumerable
1集合)
at System.Linq.Enumerable.ToList [TSource](IEnumerable1 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()
答案 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。