2014-03-24 81 views
0

如果我不包含Ninject.Extension.Factory 3.2.0.0 3/21/2014構建,我有一個MVC5,WebApi應用程序可以正常工作。有一次,我補充一點,包裝的應用有以下異常:Ninject 3.2使用Ninject.Extension.Factory時綁定的BindFilter構造函數綁定3.2

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

這與工廠擴展無關。工廠擴展只是爲所有Func重載添加綁定,這意味着兩個構造函數都可以完全滿足。

使用Ninject 3.0時,如果有幾個具有相同優先級的構造函數被選中,不保證總是選擇相同的一個。選擇哪一個是由一些不能保證排序的.NET Framework函數的實現決定的。在最糟糕的情況下,這意味着.NET框架版本決定選擇哪個構造函數。

如果有幾個具有相同優先級的構造函數,Ninject 3.2會立即引發異常,因此您必須配置使用哪個構造函數,以便始終選取正確的構造函數。

如果我是你,我不會使用Func鍵作爲依賴,而是注入的INavigationPermissionsProvider一個實例,爲快速響應呼籲GetPermissionsInt()

+0

雷莫,謝謝!我不確定爲什麼這些構造函數具有相同的優先級。他們有不同的類型,不同的參數名稱,我綁定到特定的構造函數。 EntitleActionFilter(名單{NavigationItem} navigationItemsFunc {IEnumerable的{[黑體]串/粗體]}} permissionFunc) EntitleActionFilter(名單{NavigationItem} navigationItemsFunc {IEnumerable的{[黑體] INT [/粗體]}} permissionFuncInt) – mbeall

+0

沒有你沒有綁定到特定的構造函數。這可以通過BindFilter的其他重載來完成。你正在綁定一個過濾器,並告訴Ninject它可以選擇它感覺最適合的構造函數並添加它可能使用的兩個構造函數參數。 Ninject發現兩個構造函數,每個構造函數都有2個參數,它知道如何滿足。規則是採用最多參數的構造函數。所以兩者都是平等的。 –