2012-04-26 2 views
1

저는 윈저를 사용하여 새 프로젝트를 시작하려고 합니다만, 클래스 A가 클래스 B를 인스턴스화해야 할 수도 있지만 윈저가 클래스의 인스턴스를 주입하는 것이 가능하거나 불가능한 경우에 대해 궁금해했습니다. 그것으로 B. 시나리오를 생각해 보는 데 어려움을 겪고 있지만 여기에 있습니다.Castle Windsor - 다른 클래스의 컨테이너를 참조해야합니까?

WCF 서비스에 전달되는 비즈니스 엔터티 "고객"이 있다고 가정 해보십시오. 이 클래스에는 Ent.Lib 자체 유효성 검사 메서드가 있으며,이 메서드는 차례로 도우미 클래스 "CustomerValidator"를 사용합니다. 서비스에서받은 Customer 객체는 WCF에 의해 deserialize되어 Windsor는 인스턴스화에 아무런 역할을하지 않으므로 종속성을 삽입 할 수 없습니다. 또한 EntityLib에 대한 특정 서명을 따라야하므로 자체 검증 메서드로 CustomerValidator를 전달할 수 없습니다. 그렇다면이 클래스/메소드 내에서 CustomerValidator를 어떻게 인스턴스화 할 수 있습니까? 나는 여전히 단순히 "var cv = new CustomerValidator();"을 수행하는 대신 Windsor를 활용하려고합니다.

여러 가지 방법으로 해결할 수있는 훌륭한 사례는 아닙니다. Customer 클래스에 유효성 검사 메서드를 사용하는 대신 Customer 개체를 유효성 검사 메서드에 전달하지만 가능한 토론 시나리오를 제공합니다.

필자는 WindsorContainer를 공용 싱글 톤으로 공개 할 수 있습니다.이 코드는 필요로하는 모든 코드에서 액세스 할 수 있지만 위선적 인 것으로 보입니다. 다른 제안?

답변

2

다른 클래스의 컨테이너를 참조해야합니까?

아니요. 컨테이너를 참조하면 클래스에 복잡하고 불필요한 종속성이 추가되어 테스트가 복잡해지고 복잡성이 증가합니다.

서비스에서받은 Customer 개체가 WCF에 의해 deserialize되어 Windsor가 인스턴스화에 참여하지 않으므로 종속성을 삽입 할 수 없습니다.

저는 여러분이 가야 할 방향이라고 생각합니다. 만약 당신이 의존성을 주입 할 수 있도록 직렬화를 제어 할 수있는 방법이 정말로 없다면 시도해보십시오.

실패한 경우 http://commonservicelocator.codeplex.com/을 사용해보십시오. Windsor 어댑터를 사용할 수있는 Microsoft의 서비스 위치 구현 기본적으로 컨테이너를 참조한 것과 같은 패턴이지만 특정 컨테이너 구현에 의존하지는 않습니다. 또한 테스트를 위해 조롱하는 것이 더 쉬울 것이라고 생각합니다.

+2

CommonServiceLocator는 엉덩이에 통증이 있으며 음소거 포인트입니다. 어쨌든 특정 IoC에 의존하지 않기 때문에, 이제는 ONE에만 의존하지 않고 두 개의 "IoC"컨테이너에 의존하기 때문입니다. 또한 pnp로 고정되지 않는 초기화되지 않은 CSL 싱글 톤을 확인하는 데 오랜 시간이 걸리는 버그가 있습니다. [WCF 어딘가에 연결할 수있는 것 같습니다] (http://msdn.microsoft.com/en-us/magazine/cc163302.aspx). 또한 CSL 코드는 'Release'를 호출하지 않고 Windsor 정책을 추적하지 않으면 해결 된 모든 객체에 대한 참조를 그대로 유지합니다. – Henrik

+0

좋은 점, 나는 CSL이나 SL을 전혀 언급하지 않은 것으로 생각 했었습니다. –

관련 문제