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

问题描述 投票:6回答:2

我最初使用了一些自定义代码来处理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.WhereSelectListIterator2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b11.MoveNext()at System.Linq.Enumerable.d__142.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source )在System.Linq.Enumerable.d__142.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable1)的System.Web.Http.Controllers.HttpActionDescriptor.b__0(IFilterProvider fp)的Ninject.Web.WebApi.Filter.DefaultFilterProvider.GetFilters(HttpConfiguration配置,HttpActionDescriptor actionDescriptor)中。在System.Linq.Enumerable.d__a01..ctor(IEnumerable1..ctor(System.Collections.Generic.List1.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer1集合中的IEnumerable1 source) at System.Linq.Enumerable.<ReverseIterator>d__a01.MoveNext())的System.Linq.Buffer1..ctor(IEnumerable1源代码中的d__0.MoveNext()) 在System.Linq.Enumerable.ToList [TSource](IEnumerable1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy1.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) ()

ninject ninject-2 ninject-extensions
2个回答
1
投票

如果其他人正在为IFilterProvider寻找潜在的循环依赖解决方案,我必须显式绑定DefaultFilterProviders,就像这样

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

或这个

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

如果有其他人知道更好的方式,我很乐意听到它。


0
投票

我想到了。我添加了Nuget包Ninject.Web.WebApi.WebHost。

© www.soinside.com 2019 - 2024. All rights reserved.