2012-02-20 4 views
1

문자열을 생성자에서 매개 변수로 사용해야하는 클래스가 있지만이 매개 변수는 호출 코드에 의해 결정됩니다. 동일한 시점에서이 클래스의 수명은 HTTP 요청마다 연결되어야합니다. 그래서, 커스텀 PerWebRequestTimelineManager를 생성하고 config 파일의 타겟 타입에 사용했습니다. 그러나 생성자의 문자열은 동적으로 결정되어야하므로 config 파일을 통해 ConstructorInjection을 사용할 수 없습니다. 추상 팩토리를 사용하여 동적 종속성 문제를 해결할 수 있지만 구현 방법에 대해서는 잘 모르겠습니다. 아래 코드를 확인하고 접근 방식을 확인할 수 있습니까?Unity에서 런타임 매개 변수 종속성을 지정하십시오.

<register type="IPerformanceTracer" mapTo="PerformanceTracer"> 
    <lifetime type="PerWebRequest"/> 
</register> 
<register type="IPerformanceTracerFactory" mapTo="PerformanceTracerFactory"/> 

: 응용 프로그램에서 연속 해결 호출이 동일한 인스턴스 :

public class PerformanceTracerFactory : IPerformanceTracerFactory 
{ 
    private readonly IPerformanceTracer tracer; 

    public IPerformanceTracer CreateInstance(string operationTitle) 
    { 
     _container.RegisterType<IPerformanceTracer, PerformanceTracer>(new InjectionConstructor(operationTitle)); 

     return _container.Resolve<IPerformanceTracer>(); 
    } 
} 
설정 파일의

관련 부분을 검색 할 수 있지만, 특히 REGISTERTYPE 및 해결 통화 장소에서 조금 보인다 나는 또 다른 질문이있다. 코드를 사용하여 종속성을 구성하고 주입하는 위의 방법이 맞다면 config 엔트리가 필요 없다고 생각합니다. 사용자 정의 수명 매니저를 밀기 위해 항상 적절한 과부하를 사용할 수 있습니다. 예를 들어, 설정 파일 만 사용하여 같은 결과를 얻고 싶다면 솔루션을 코딩하려면 어떻게해야합니까?

답변

1

컨테이너 기반 팩토리를 사용하는 경우 각 통화에서 IPerformanceTracer을 등록/해결할 필요가 없습니다.

구성 파일에 IPerformanceTracer ->PerformanceTracer 매핑을 한 번 등록하고 인터페이스를 확인할 때 ParameterOverride을 사용하십시오.

public IPerformanceTracer CreateInstance(string operationTitle) 
{ 
    return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle); 
} 
+0

답변 해 주신 Sebastian에게 감사드립니다. 그것은 문제를 완벽하게 해결했습니다. 전체 API에 대한 무지로 인해 비슷한 문제가 발생하지 않도록 요청할 부탁을드립니다. Unity API 문서를 참조하기에 가장 좋은 장소는 무엇입니까? – koder

+0

@ user608100 실망 시키셔서 유감 스럽지만 Unity 문서는 일반적으로 두려운 것입니다. 일부 정보는 [MSDN] (http://msdn.microsoft.com/en-us/library/ff663144.aspx)에서 찾을 수 있습니다. 그러나 당신은 그 재료의 대부분을 스스로 알아 내야합니다. 저는 현재 CodePlex의 Unity 사이트에 올려 져 Unity의 내부를 밝혀주는 두 개의 기사를 작성 중입니다. 그러나 그들은 번역하는데 좀 더 시간이 걸릴 것입니다. –

관련 문제