当使用Ninject.Extension.Factory 3.2时,Ninject 3.2 BindFilter构造函数绑定被破坏

时间:2014-03-24 15:24:44

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

我有一个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软件包(所有星期五,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和工厂扩展一起使用。

1 个答案:

答案 0 :(得分:1)

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

使用Ninject 3.0,如果有几个具有相同的优先级,则选择任何构造函数。无法保证始终选择相同的一个。选择哪一个是由一些.NET Framework函数的实现决定的,这些函数不能保证订购。在最坏的情况下,它意味着.NET框架版本决定选择哪个构造函数。

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

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