2010-02-24 3 views
4

문제를 설명하기 위해 다음은 간단한 설치입니다.범위를 변경하는 Structuremap이있는 다중 생성자?

public interface IFactory{ } 

public class Factory : IFactory 
{ 
    public Factory() 
    { 
     Console.WriteLine("parameterless"); 
    } 

    //public Factory(int i) 
    //{ 
    // Console.WriteLine("with parameter : {0}", i); 
    //} 

} 

프로그램이이 consoleApp입니다 테스트하기 : 나는이 같은 공장을 가지고. 내 요점을 증명하기에 충분 해.

static void Main(string[] args) 
{ 
    Init(); 
    var factory1 = ObjectFactory.GetInstance<IFactory>(); 
    var factory2 = ObjectFactory.GetInstance<IFactory>(); 
    var factory3 = ObjectFactory.GetInstance<IFactory>(); 
    Console.Read(); 
} 

설정 초기화 static 메소드에서 strucutreMap을 설정하십시오. 완벽하게 작동하고, 출력이
이 매개 변수가
이 매개 변수가
매개 변수가

호출 할 때마다 빌드를 보여줍니다

x.For<IFactory>().Use<Factory>(); 

:이 같은 단 하나의 생성자 및 설정 StructureMap이있는 경우

public static void Init() 
     { 
      ObjectFactory.Initialize(x => 
      { 
       //insert Initialization code here. 
      }); 
     } 

새로운 인스턴스.

이제 두 번째 생성자의 주석을 제거했지만 매개 변수가없는 매개 변수를 사용하고 같은 기본 라이프 스타일을 사용하려고합니다. 나는 어떻게 할까?

x.SelectConstructor<IFactory>(() => new Factory()); 
x.For<IFactory>().Use<Factory>(); 

는 그냥 작동하지 않습니다 :

나는 것을 시도 누락 요청 인스턴스 속성을 "내가"InstanceKey

내가 이렇게 할 경우

x.For<IFactory>().Use(new Factory()); 

그것은 작동 , 출력은 "매개 변수가없는"매개 변수 일 뿐이므로 각 호출에 대해 새 인스턴스를 작성하지 않습니다. 그것은 내가 통과 한이 특정 인스턴스를 사용하고 있습니다.

유일한 방법은 [DefaultConstructor]를 매개 변수없는 생성자 위에 추가하고 표준 x.For()를 사용하는 것입니다. 하지만이 속성을 추가하고 내 모델 전체에 구성을 전파하고 싶지 않습니다.

도움 말?

답변

9

SelectConstructor는 인터페이스가 아닌 구체적인 유형을 사용합니다. 물론 인터페이스에는 생성자가 없습니다. 하지만 아무 것도 부러지지 않습니다. 그냥 무시됩니다. 그래서 나는 그 오류를 발견 할 수 없었습니다.

x.SelectConstructor<IFactory>(() => new Factory()); 
x.For<IFactory>().Use<Factory>(); 

해야

x.SelectConstructor<**Factory**>(() => new Factory()); 
x.For<IFactory>().Use<Factory>(); 
관련 문제