【问题标题】:Ninject + Web ApI 2: Error activating IFilterProvider using binding from IFilterProvider to DefaultFilterProviderNinject + Web ApI 2:使用从 IFilterProvider 到 DefaultFilterProvider 的绑定激活 IFilterProvider 时出错
【发布时间】:2014-07-24 00:38:07
【问题描述】:

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

使用从 IFilterProvider 绑定到激活 IFilterProvider 时出错 DefaultFilterProvider 在 两个服务的构造函数。

激活路径:3)将依赖IFilterProvider注入到 类型构造函数的参数 defaultFilterProviders DefaultFilterProviders 2) 依赖注入 DefaultFilterProviders 变成构造函数的参数 filterProviders DefaultFilterProvider 类型 1) 请求 IFilterProvider

建议:1)确保您没有声明依赖 服务的任何实现上的 IFilterProvider。 2)考虑 将服务组合成一个服务以消除循环。 3) 使用 属性注入代替构造函数注入,并实现 如果您需要在之后运行初始化逻辑,则可初始化 属性值已被注入。

在 Ninject.Activation.Context.Resolve() 在 Ninject.KernelBase.c__DisplayClass15.b__f(IBinding 绑定) 在 System.Linq.Enumerable.WhereSelectListIterator2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b11.MoveNext() 在 System.Linq.Enumerable.d__142.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 源)在 Ninject.Web.WebApi.Filter.DefaultFilterProvider.GetFilters(HttpConfiguration 配置,HttpActionDescriptor actionDescriptor)在 System.Web.Http.Controllers.HttpActionDescriptor.b__0(IFilterProvider fp) 在 System.Linq.Enumerable.d__142.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable1.d__0.MoveNext() 在 System.Linq.Buffer1..ctor(IEnumerable1 来源)在 System.Linq.Enumerable.d__a01.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.<ReverseIterator>d__a01.MoveNext() 在 System.Collections.Generic.List1..ctor(IEnumerable1 个集合)
在 System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy1.CreateValue() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Lazy`1.get_Value() 在 System.Web.Http.Controllers.HttpActionDescriptor.GetFilterPipeline()
在 System.Web.Http.Controllers.HttpActionDescriptor.GetFilterGrouping()
在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext 控制器上下文,CancellationToken 取消令牌)在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage 请求,CancellationToken 取消令牌)在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()

【问题讨论】:

    标签: ninject ninject-2 ninject-extensions


    【解决方案1】:

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

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

    或者这个

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您能解释一下您是如何解决这个问题的吗?
      • 当然,我在我的项目中添加了“Ninject.Web.WebApi.WebHost”包。这个包不是自动拉进来的,需要手动添加。
      • 谢谢,但不幸的是它没有帮助我
      • 我也没有。我仍然有同样的问题。
      猜你喜欢
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多