当使用Ninject. extension . factory时,BindFilter构造函数绑定被破坏

本文关键字:构造函数 BindFilter 绑定 Ninject extension factory | 更新日期: 2023-09-27 17:52:36

我有一个MVC5, WebApi应用程序,工作良好,如果我不包括Ninject.Extension.Factory 3.2.0.0 3/21/2014构建。一旦我添加了这个包,应用程序就会出现以下异常:

Error activating EntitleActionFilter using self-binding of EntitleActionFilter
Several constructors have the same priority. Please specify the constructor using ToConstructor syntax or add an Inject attribute.
Constructors:
EntitleActionFilter(List{NavigationItem} navigationItemsFunc{IEnumerable{string}} permissionFunc)
EntitleActionFilter(List{NavigationItem} navigationItemsFunc{IEnumerable{int}} permissionFuncInt)

我正在使用以下Ninject包(所有星期五,3/21/2014版本):

  • Ninject 3.2.0.0
  • Ninject。MVC5 3.2.0.0
  • Ninject.Web。常见3.2.0.0
  • Ninject.Web.Common。高手写3.2.0.0

这两个构造函数是唯一的。这些绑定看起来像:

Func<IEnumerable<int>> permissionFunc = () => Kernel.Get<INavigationPermissionsProvider>().GetPermissionsInt();
this.BindFilter<EntitleActionFilter>(FilterScope.Controller, 0)
    .WithConstructorArgument("navigationItems",
         context => context.Get<NavigationHelper>().GetNavigation().NavigationItems)
    .WithConstructorArgument("permissionFuncInt", permissionFunc);

我确实经常使用Ninject工厂,并且需要这个包。如果我删除了Ninject.Extensions.Factory 3.2包,一切都会正常工作。同样的代码也适用于之前3.0版本的Ninject和factory扩展。

当使用Ninject. extension . factory时,BindFilter构造函数绑定被破坏

这与工厂扩展无关。工厂扩展只是为所有的Func重载添加绑定,这意味着两个构造函数都可以完全满足。

在Ninject 3.0中,如果有几个具有相同优先级的构造函数,则选择其中任何一个。不能保证总是选择相同的一个。选择哪一个是由一些。net框架函数的实现决定的,这些函数不能保证顺序。在最坏的情况下,它意味着。net框架版本决定选择哪个构造函数。

Ninject 3.2现在抛出一个异常,如果有几个具有相同优先级的构造函数,所以你必须配置哪个构造函数被采用,以便总是选择正确的那个。

如果我是你,我不会使用Func作为依赖项,而是注入INavigationPermissionsProvider的实例并调用GetPermissionsInt()