2010-05-13 3 views
36

DI 용 StructureMap을 사용하고 있습니다. 내가 지정해야StructureMap을 사용할 때 생성자 인수 전달

public class ProductProvider : IProductProvider 
{ 
    public ProductProvider(string connectionString) 
    { 
     .... 
    } 
} 

의 I는 IProductProvider의 인스턴스를 얻을 때 "런타임에서 을 ConnectionString을 다음과 같이 내가 StructureMap를 구성

을 : 내가 좋아하는 1 개 인자를 클래스를 상상해보십시오. :

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>(). 
WithCtorArgument("connectionString"); 

그러나, 나는 EqualTo가 전화를하고 싶지 않아 ("뭔가 ...") 방법을 여기에 내가 동적 런타임에서이 값을 지정하는 일부 시설을 필요로한다.

제 질문은 ObjectFactory를 사용하여 IProductProvider의 인스턴스를 어떻게 얻을 수 있습니까?

현재, 내가 좋아하는 뭔가가 있습니다

ObjectFactory.GetInstance<IProductProvider>(); 

을하지만 당신도 알다시피, 이것은 어떤 조언을 크게 감상 할 수

... 작동하지 않습니다.

답변

32

직접 답변을 찾았습니다. 해결책은 다음과 같습니다.

ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>(); 

희망 사항은 동일한 문제를 겪고있는 다른 사람들에게 도움이되기를 바랍니다.

+1

someValueAtRuntime은 Func 또는 Lambda (검색 할 수있는 경우)가 아닌 간단한 값이어야합니다. 그렇지 않으면 종속성이 해결 될 때마다 해당 함수가 실행됩니다. 내가하는 것처럼 연결 문자열을 삽입하는 데이 트릭을 사용했습니다. ObjectFactory를 설정하기 전에 문자열을 로컬 변수로 가져 오면 괜찮을 것입니다. – Mel

+5

요. arg1, 2, 3 등 여러 인수가있는 경우 어떻게됩니까? 그리고 모든 인수를 그대로 전달하지만 args 중 하나를 null로 유지하려고합니다. 이 작업을 수행하는 방법? –

+0

@Mosh 답변을 주셔서 감사합니다. 어떻게 당신이 someValueAtRuneTime을 어떻게 전달하고 있는지 말해 주실 수 있습니까? 제발 그것의 예. – wandos

51

나는 그것을 StructureMap 구성으로 선언하는 것이 좋습니다.

For<IProductProvider>().Use<ProductProvider> 
    .Ctor<string>("connectionString").Is(someValueAtRunTime); 

당신이 값을 알 필요에서 부담 클라이언트 코드를하지 않고 메인 코드를 분리하여 IOC의 구성을 유지할 수 있습니다이 방법 : 약간 새로운 StructureMap 코드를 사용.

+1

저는 이것이 당신이 StructureMap을 구성했다는 것을 짐작하고 있습니다. 거기에'someValueAtRunTime'을 어떻게 넘겨 줍니까? – user1713059