2014-03-24 3 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 Framework 버전이 생성자를 선택하는지 결정합니다.

Ninject 3.2에서는 우선 순위가 동일한 여러 생성자가있는 경우 예외가 발생하므로 생성자를 구성해야하므로 올바른 생성자가 항상 선택됩니다.

너 I I 종속성과 같은 Func을를 사용하는 대신 INavigationPermissionsProvider의 인스턴스를 주입하고 빠른 응답을 GetPermissionsInt()

+0

레모, 감사 전화를하지 않을 경우! 왜 이러한 생성자가 같은 우선 순위를 가질 지 모르겠습니다. 그것들은 다른 타입, 다른 파라미터 이름을 가지며 특정 생성자에 바인딩됩니다. EntitleActionFilter (목록 {NavigationItem} navigationItemsFunc {는 IEnumerable {[대담] 문자열/대담]}} permissionFunc) EntitleActionFilter (목록 {NavigationItem} navigationItemsFunc {는 IEnumerable {[대담] INT [/ 대담]}} permissionFuncInt) 아니오 – mbeall

+0

특정 생성자에 바인딩되지 않습니다. 이것은 BindFilter의 다른 오버로드에 의해 수행됩니다. 필터를 바인딩하고 Ninject에게 가장 잘 맞는 생성자를 선택하고 사용할 수있는 두 개의 생성자 인수를 추가 할 수 있다고 알려줍니다. Ninject는 두 개의 생성자를 찾아서 각각 만족시키는 방법을 알고있는 두 개의 매개 변수를 갖습니다. 규칙은 대부분의 매개 변수를 사용하여 생성자를 가져 오는 것입니다. 그래서 둘 다 평등합니다. –