【问题标题】:Ninject 3.2 BindFilter constructor binding broken when using Ninject.Extension.Factory 3.2Ninject 3.2 BindFilter 构造函数绑定在使用 Ninject.Extension.Factory 3.2 时被破坏
【发布时间】:2014-05-02 01:21:36
【问题描述】:

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

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 包(所有星期五,2014 年 3 月 21 日构建):

  • Ninject 3.2.0.0
  • Ninject.MVC5 3.2.0.0
  • Ninject.Web.Common 3.2.0.0
  • Ninject.Web.Common.WebHost 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 和工厂扩展。

【问题讨论】:

    标签: c# asp.net-mvc ninject factory


    【解决方案1】:

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

    在 Ninject 3.0 中,如果有多个具有相同优先级的构造函数,则选择任何构造函数。不能保证总是选择同一个。选择哪一个取决于某些 .NET Framework 函数的实现,这些函数不能保证排序。在最坏的情况下,这意味着 .NET 框架版本决定选择哪个构造函数。

    如果有多个具有相同优先级的构造函数,Ninject 3.2 现在会抛出异常,因此您必须配置采用哪个构造函数,以便始终选择正确的构造函数。

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

    【讨论】:

    • 雷莫,感谢您的快速回复!我不确定为什么这些构造函数具有相同的优先级。它们有不同的类型,不同的参数名称,我绑定到特定的构造函数。 EntitleActionFilter(List{NavigationItem} navigationItemsFunc{IEnumerable{[bold]string/bold]}} permissionFunc) EntitleActionFilter(List{NavigationItem} navigationItemsFunc{IEnumerable{[bold]int[/bold]}} permissionFuncInt)
    • 不,您没有绑定到特定的构造函数。这将通过 BindFilter 的另一个重载来完成。您正在绑定一个过滤器并告诉 Ninject 它可以选择它认为最适合的构造函数并添加它可能使用的两个构造函数参数。 Ninject 找到两个构造函数,每个构造函数都有 2 个它知道如何满足的参数。规则是采用具有最多参数的构造函数。所以两者都是平等的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多