9

2 개의 생성자가있는 클래스가 있습니다.다른 구조체를 사용하기위한 맵핑

MyClass에()

MyClass에 (IMyService 서비스)

내가 할 때마다 내가 StructureMap를 어떻게 알 수 있습니까 후 '새 MyClass에()를'실제로 두 번째 생성자를 호출해야하지 첫 번째 생성자.

도와주세요.

답변

20

new MyClass()을 호출하면 StructureMap이 전혀 관련되지 않습니다. 어떤 양의 StructureMap 구성으로도 동작이 변경되지 않습니다.

ObjectFactory.GetInstance<MyClass>()을 호출하면 StructureMap은 기본적으로 더 많은 매개 변수로 생성자를 호출합니다.

당신이 StructureMap 다른 생성자를 사용하려는 경우, 당신은 (PHeiberg의 대답을 통해) 생성자 지정할 수 있습니다

x.SelectConstructor<IMyClass>(() => new MyClass(null)); 

을 아니면 단지 Use()의 오버로드를 사용하여 인스턴스를 만드는 방법을 명시 적으로 StructureMap를 말할 수 받아들이는 Func<> : 여호수아의 대답은 모든 측면을 덮고

x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>())) 
+0

매개 변수가 2 개인 MyClass 생성자를 사용하려면 어떻게해야합니까? 'ctx.GetInstance <>'는 1 개의 타입 파라미터 만 허용합니다. –

5

. 당신이 SelectContructor 방법을 사용할 수 있습니다 여호수아의 예에서 수행으로 생성자에 인수를 하드 코딩하지 않고 특정 생성자를 선택 Structuremap를 구성하기 위해 보조 노트로 :

x.SelectConstructor<MyService>(() => new MyService()); 

SelectConstructor 메서드 호출에 람다가 호출해야 필요한 생성자 (null 또는 모든 매개 변수에 대해 올바른 유형의 값을 입력하십시오). 자세한 내용은 the documentation을 참조하십시오.

0

구조체 맵과 같은 DI 컨테이너를 사용하는 경우 모든 클래스에 단 하나의 생성자 만있는 것이 가장 좋습니다. 이 생성자는 IMyService이 종속성 (약간 이상하게 보임) 인 경우 클래스의 모든 종속성을 해결해야합니다. 이는 매개 변수없는 생성자가 필요 없도록 인스턴스화 할 때 항상 해결되어야합니다.

+0

죄송합니다, 지금 수정했습니다. CMyService 대신 사용자 CMyClass가 있습니다. 감사. –

관련 문제