2010-08-20 4 views
6

내가 그것을 해결 때 기본적으로 제공되는 생성자 매개 변수를 갖고 싶어이성 윈저 - 생성자 매개 변수에 따라 구성 요소를 확인하는 방법을

public class MyComponent 
{ 
    public MyComponent(string name) 
    { 
    } 
} 

같은 구성 요소가 구성 요소 식별자의 일부로서 행동 말해봐. 해당 매개 변수 집합으로 해결하지 못했다면 새로운 매개 변수 집합을 인스턴스화합니다. 그것이 미래의 모든 이름 = A에 대해 동일한 개체를 반환 = 이름으로 인스턴스화하고 있기 때문에 현재 실패

IWindsorContainer container = new WindsorContainer(); 
container.Register(Component.For<MyComponent>()); 
MyComponent a1 = container.Resolve<MyComponent>(new { name = "a" }); 
MyComponent a2 = container.Resolve<MyComponent>(new { name = "a" }); 
MyComponent b = container.Resolve<MyComponent>(new { name = "b" }); 

Assert.AreSame(a1, a2); 
Assert.AreNotSame(a1, b); 

을 : 즉

, 나는 성공하기 위해 어떻게 든 다음 테스트를 수정할 이름 = b.

감사합니다.

+1

** 확실하게 ** 등록 시간 대신 해결 시간에이 작업을 수행 하시겠습니까? –

답변

6

일반적으로 등록시에 이루어지며 해결시에는 적용되지 않습니다. 사실 컨테이너에서 서비스 로케이터를 사용하기 때문에 코드에서 Resolve()를 호출하는 것이 드뭅니다. 대신 당신이 일반적으로 서비스를 대체하거나 다른 서비스로 주입하기를 MyComponent 선택하는 핸들러 선택기를 사용 (테스트 목적으로 순전히이다) 내 코드에서와 같이 해결()를 사용

container.Register(
    Component.For<MyComponent>() 
      .Named("comp_a") 
      .DependsOn(new { name = "a" }), 
    Component.For<MyComponent>() 
      .Named("comp_b") 
      .DependsOn(new { name = "b" })); 

var a1 = container.Resolve<MyComponent>("comp_a"); 
var a2 = container.Resolve<MyComponent>("comp_a"); 
var b = container.Resolve<MyComponent>("comp_b"); 
Assert.AreSame(a1, a2); 
Assert.AreNotSame(a1, b); 

.

+0

나는 그것을 할 수 있다는 것을 알고 있지만 실제로는 입력 된 자동 공장 기능을 사용하고 있습니다. 기본적으로 Get {component-name} 메소드를 사용하여 구성 요소를 선택할 수 있지만 나에게 동적이어야합니다. 그러나 Get (component-name) 메서드 또는 이와 유사한 메서드를 구현할 수있는 선택기를 작성할 수있는 것처럼 보입니다. – Cameron

+0

@Cameron : 문제와 관련된 모든 관련 세부 정보 및 관련 테스트 사례를 설명하는 다른 질문을 만드는 것이 좋습니다. 이 주석이 있기 전까지는 입력 된 공장 시설에 대한 언급이 없었습니다. –

+0

원래 질문에 설명 된 내용이 가능한지 알고 싶었습니다. 소스 코드를 읽었을 때 공장 지원 시설이 컨테이너 밑에 무엇을하고 있는지 알았으므로 컨테이너 자체가 내가 설명한 것과 비슷한 것을 지원했는지 알고 싶었습니다. 그렇지 않으면 괜찮습니다. 다른 방법으로 구현하겠습니다. – Cameron