2014-01-23 1 views
2

나는 이것을 overthinking 수도 있습니다. 나는 그렇게 희망한다.캐슬 Windsor 특정 구성 요소의 주입

.Net 4.5, C# 5 Windows 서비스에서는 Castle Windsor 3.2를 CollectionResolver과 함께 사용하고 있습니다. 우리는 당신이 기대하는대로 인터페이스 IEncryptionService을 가지고 있으며, 두 개의 클래스가 그 인터페이스를 구현합니다. 이 서비스는 하나의 데이터를 해독하고 다른 데이터를 다시 암호화함으로써 다른 두 시스템을 통합하고 연결해야합니다.

두 구현은 모두 대상 시스템에 따라 이름을가집니다.

Component.For<IEncryptionService>() 
    .ImplementedBy<System1EncryptionService>() 
    .Named("system1-encryption") 
    .LifestyleTransient(), 
Component.For<IEncryptionService>() 
    .ImplementedBy<System2EncryptionService>() 
    .LifestyleTransient() 
    .Named("system2-encryption")); 

Windows 서비스 클래스는 생성자 삽입을 사용하여 IEncryptionService[] 유형의 배열을 수신합니다. 두 가지 암호화 클래스가 모두 주입됩니다.

거기에 문제가 있습니다. 한 시스템에는 하나의 구현을 사용해야하고 다른 시스템에는 하나의 구현을 사용해야합니다. 지금까지 구현 한 방식대로 서로 구별 할 수 없습니다.

해결책은 무엇입니까? 형식이 지정된 공장은 건축상의 결함을 감추는 반 패턴처럼 보입니다. 하지만 내가 생각해 낸 유일한 것. 구성 요소의 이름을 지정했습니다. 다른 구성 요소에서이를 활용할 수 있습니까? 아니면 주사를 잊어서 직접 인스턴스화해야합니까?

나는 이런 종류의 상황이 자주 발생하여 충분히 처리 할 수있을 것이라고 생각한다. 당신은이에 따라 구성 요소를 등록 할 때

답변

1

것은, 당신이 Compnent.For 라인에 주입 된 클래스에 해당하는 인수의 이름을 지정합니다

Component.For<IServiceUsingTheEncryption>() 
    .ImplementedBy<ServiceUsingTheEncryption>() 
    //.LifestyleOfYourChoosing 
    .ServiceOverrides(
     ServiceOverride.ForKey("encryptionService1").Eq("system1-encryption"), 
     ServiceOverride.ForKey("encryptionService2").Eq("system2-encryption")); 

그리고 당신의 ServiceUsingTheEncryption의 ctor에를 지정할 것 그러한 주장은 다음과 같다 :

public ServiceUsingTheEncryption(IEncryptionService encryptionService1, IEncryptionService encryptionService2) { 
    // ... 
} 
관련 문제