我有一个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日版本):
这两个构造函数是唯一的。绑定看起来像:
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和工厂扩展一起使用。
答案 0 :(得分:1)
这与工厂扩展无关。工厂扩展只是为所有Func重载添加了绑定,这意味着两个构造函数都可以完全满足。
使用Ninject 3.0,如果有几个具有相同的优先级,则选择任何构造函数。无法保证始终选择相同的一个。选择哪一个是由一些.NET Framework函数的实现决定的,这些函数不能保证订购。在最坏的情况下,它意味着.NET框架版本决定选择哪个构造函数。
如果有几个具有相同优先级的构造函数,则Ninject 3.2现在抛出异常,因此您必须配置采用哪个构造函数,以便始终选择正确的构造函数。
如果我是你,我不会使用Func作为依赖,而是注入INavigationPermissionsProvider
的实例并调用GetPermissionsInt()