2017-02-06 1 views
-1

내가 Ninject에이 인터페이스에 공장을 만들 지시 :Ninject에 .ToFactory : 예외 : "예외가 발생 : 'Ninject.ActivationException'을 Ninject.dll에서"

this.Bind<IModelFactory>().ToFactory().InSingletonScope(); 

이 팩토리 인터페이스에서, 나는 공장을 정의 :

interface IModelFactory 
{ 
    MyClass CreateMyClassFactory(string param1, DateTime param2); 
} 

그때 새로운 클래스 생성하기 위해 공장을 사용하려고 :

Class myClass = modelFactory.CreateMyClassFactory(param1, new DateTime(2017,01,01); 

를 ... 그러나 그것은 던져 의이 예외 : 던져

예외 : 'Ninject.ActivationException'Ninject.dll에

추가 정보 : 오류 활성화 문자열

일치하는 바인딩을 사용할 수 없으며, 유형 자기 바인딩되지 않습니다 .

활성화 경로 :

2)

제안 HedgeOrderMyClass에 대한 형 MyClass에의 생성자

1) 요청의 매개 변수 제목에 의존 문자열의 주입 :

1) 당신이 있는지 확인 string에 대한 바인딩을 정의했습니다.

2) 바인딩이 모듈에서 정의 된 경우 모듈이 커널에로드되었는지 확인하십시오.

3) 실수로 둘 이상의 커널을 만들지 않았는지 확인하십시오.

4) 생성자 인수를 사용하는 경우 매개 변수 이름이 생성자 매개 변수 이름과 일치하는지 확인하십시오.

5) 자동 모듈로드를 사용하는 경우 검색 경로와 필터가 올바른지 확인하십시오.

+0

[여기] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)에 자세히 설명되어있는 것처럼 공장 추상화를 방지합니다. – Steven

답변

0

인터페이스에 팩토리를 생성하도록 Ninject에 지시하면 런타임에 누락 된 매개 변수를 채우고 컨테이너에서 새 클래스 복사본을 가져 오도록 요청할 것입니다.

public class MyClass 
{ 

} 

을만큼 유형 stringDateTime의 매개 변수를 받아들이는 적어도 하나의 생성자가있는 한, 그것은 작동합니다 :

public class MyClass 
{ 
    // If this constructor is missing, then it throws an exception! 
    MyClass(string param1, DateTime param2, ISomeOtherInterface someOtherInterface) 
    { 
    } 
} 

Ninject에

클래스는 우리가 원하는 것입니다 ISomeOtherInterface을 해결하는 방법을 알고 있으므로 문제가되지 않습니다 (다른 곳에서는 Bind<>.To<>을 사용한다고 가정). 그러나 string param1DateTime param2은 어떻게 해결됩니까?

팩토리 메서드는 구조 호출에 대한 인수에서 해당 매개 변수를 채우고 모든 것이 제대로 작동합니다.

디버거를 사용하여 실행하면 위의 생성자가 호출되고 공장 제작 호출에 지정된 매개 변수와 동일한 매개 변수가 표시됩니다.

이것은 정말 강력한 아이디어이며, 직접 모든 접착제 코드를 작성해야 자신의 공장을 만들 필요가 없습니다.

+0

'MyClass' 생성자는 런타임 값을 컴파일 타임 의존성과 혼합합니다. 이것은 [반 패턴입니다] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99). – Steven

+0

@Steven 때로는 사용자 정의 매개 변수를 사용하여 런타임에 Dependency Injection 컨테이너에서 새 클래스를 가져와야합니다. 팩토리 패턴은 이것을 허용합니다. 전문적으로 C#을 사용하여 4 년을 보내면 결국 공장 패턴에 의지하지 않고는 해결할 수없는 문제로 끝납니다. 그것은 상상의 모든 스트레칭에 의한 반 패턴이 아닙니다. 그것은 공식적인 GOF 공장 패턴입니다. – Contango

+0

기사를 읽으십시오. – Steven