我最初使用了一些自定义代码来处理Web API中的依赖项解析,它运行正常。我遇到的问题是我想将过滤器绑定到我的控制器范围,就像使用MVC一样。例如,Kernel.BindFilter。新的Ninject.We.WebApi包具有我想要的绑定扩展名,但是一旦我将它添加到我的项目中,我就会收到以下错误。我没有更改任何代码,只是引用DLL。
使用从IFilterProvider到DefaultFilterProvider的绑定激活IFilterProvider时出错在两个服务的构造函数之间检测到循环依赖。
激活路径:3)将依赖项IFilterProvider注入到DefaultFilterProviders类型的构造函数的参数defaultFilterProviders中2)将依赖项DefaultFilterProviders注入参数filterProviders类型为DefaultFilterProvider的构造函数1)请求IFilterProvider
建议:1)确保您没有在服务的任何实现上声明IFilterProvider的依赖项。 2)考虑将服务组合成一个服务以消除周期。 3)使用属性注入而不是构造函数注入,如果需要在注入属性值后运行初始化逻辑,则实现IInitializable。
at Ninject.Activation.Context.Resolve()at Ninject.KernelBase。<> c__DisplayClass15.b__f(IBinding binding)at 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 )在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)的System.Web.Http.Controllers.HttpActionDescriptor.b__0(IFilterProvider fp)的Ninject.Web.WebApi.Filter.DefaultFilterProvider.GetFilters(HttpConfiguration配置,HttpActionDescriptor actionDescriptor)中。在System.Linq.Enumerable.d__a01..ctor(IEnumerable
1..ctor(System.Collections.Generic.List1.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer
1集合中的IEnumerable1 source) at System.Linq.Enumerable.<ReverseIterator>d__a0
1.MoveNext())的System.Linq.Buffer1..ctor(IEnumerable
1源代码中的d__0.MoveNext()) 在System.Linq.Enumerable.ToList [TSource](IEnumerable1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy
1.CreateValue()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Lazy的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处System.Web.Http.Controllers.HttpActionDescriptor.GetFilterPipeline()中的`1.get_Value() 在System.Web.Http.Controllers.HttpActionDescriptor.GetFilterGrouping() System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext上的System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage请求,CancellationToken cancellationToken)中的System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken) ()
如果其他人正在为IFilterProvider寻找潜在的循环依赖解决方案,我必须显式绑定DefaultFilterProviders,就像这样
k.Bind<DefaultFilterProviders>().ToConstant(new DefaultFilterProviders(GlobalConfiguration.Configuration.Services.GetFilterProviders()));
或这个
k.Bind<DefaultFilterProviders>().ToSelf().WithConstructorArgument(GlobalConfiguration.Configuration.Services.GetFilterProviders());
如果有其他人知道更好的方式,我很乐意听到它。
我想到了。我添加了Nuget包Ninject.Web.WebApi.WebHost。