2014-10-30 4 views
1

내 작업은 최상위 수준 종속성이 특정 유형 인 경우 특정 비 직접 자식 종속성을 주입하는 것입니다. 하위 컨테이너로이 작업을 시도했지만 예상대로 작동하지 않습니다.WindsorCastle 자식 컨테이너 부모 종속성 확인

PRMController: ApiController 
    -> PManager: IManager 
     -> Repository: IRepository 
      -> RepositoryConnection: IRepositoryConnection 
        RepositoryConnection() { /*use default config name*/ } 
        RepositoryConnection(string configName) 

윈저 컨테이너가 다음 등록 :

container.Register(Classes.FromAssemblyInThisApplication() 
      Pick() 
      .Configure(c => 
      { 
       c.Named(Guid.NewGuid().ToString()); 
       c.IsFallback(); 
      }) 
      .WithService.DefaultInterfaces() 
      .LifestyleTransient() 
      ); 

var childContainer = new WindsorContainer() 
     .Register(
      Component.For<IRepositoryConnection>().ImplementedBy<RepositoryConnection>() 
       .DependsOn(Dependency.OnValue("configName", "PRM")) 
       .LifestyleTransient() 
      ); 
     container.AddChildContainer(childContainer); 

지금 PRM 컨트롤러는 "PRM"모두 configname를 사용해야합니다

나는 다음의 클래스 계층 구조를 가지고있다. 따라서 하위 컨테이너는 PRM 컨트롤러를 해결하는 데 사용됩니다. 그러나 RepositoryConnection은 기본 구성으로 해결됩니다.

childContainer.Resolve<IRepositoryConnection>(); //as expected, resolves from child container registrations 
childContainer.Resolve<PRMController>(); //NOT as expected, the underlying repositoryConnection is from parent container 

누군가가이를 밝힐 수 있습니까? 부모 컨테이너에 등록 된 유형의 하위 컨테이너에서 해결하는 경우에도 윈저가 하위 컨테이너의 종속성을 선호한다고 생각했습니다. 그게 가능하지 않다면, 누군가가 나를 올바른 방향으로 이끌 수 있다면 감사 할 것입니다.

업데이트 : 에 따르면 this thread에 따르면 버그가 있습니다. 그래서 그것은 해결 될 것입니까? 설명 된 시나리오에 대해 내가 취할 수있는 다른 전략은 무엇입니까?

답변

1

IHandleSelector를 통해 원하는 것을 얻었으므로 HasOpinion에서 현재 URL이 PRMController인지 확인하십시오. SelectHandler은 필요한 유형 인 IRepositoryConnection을 반환합니다.

컨트롤러 컨테이너에서 컨트롤러가 정확히 무엇인지 알고 있으므로 핸들 선택기를 사용하여 Request.Url에서 구문 분석해야하므로 아이 콘테이너를 사용하는 것이 좋습니다.

유감스럽게도 하위 컨테이너 경로는 Windsor 3.2 및 3.3에서 예상대로 (적어도 예상 한대로) 작동하지 않는 것 같습니다.