2008-11-08 2 views
9

여러 인터페이스를 구현하는 클래스가 있습니다. XML을 통해 이러한 인터페이스를 등록하고 싶습니다. 필자가 발견 한 것은 새로운 Fluent Interface의 문서입니다. 이 옵션은 XML을 통해 지원됩니까? 이 기능을 추가 할 때 어떤 영향이 있습니까?Castle-Windsor는 XML 구성을 통해 ForwardedTypes를 지원합니까?

+0

그냥 알다시피, 이제 프레임 워크에 구워집니다. –

+0

@Krzysztof :이 기능이 필요하며 휠을 재발 명하지 않을 것입니다. 불행히도, 이것에 관해서는 아무것도 찾을 수 없습니다. Xml 구성을 통해 기본 제공 유형 전달과 관련된 설명서 또는 링크가 있습니까? –

+0

johny g - 문서에 있습니다. http://www.castleproject.org/container/documentation/v21/manual/windsorconfigref.html –

답변

10

[업데이트] 이제 Windsor 2.1 이상에서 가능합니다. 구문 here에 대한 설명서를 참조하십시오.


이 기능은 .. 현재로 XML 인터프리터에서 아직 구현되지 않은, 그러나 그것은 시설을 통해 지원을 추가하는 것은 어렵지 않다 결석에 다른 기능을 추가하고자 할 때 (분명히이 기술은 유용 기존 구성 파서).

그래서 우선 우리는 핸들러가 유형에 대해 생성 될 때 감지하는 기능을 추가하고 기존 핸들러를 가리 키도록 동시에 전달 된 서비스 중 하나를 등록합니다 :

public class HandlerForwardingFacility : AbstractFacility 
{ 
    IConversionManager conversionManager; 

    protected override void Init() 
    { 
    conversionManager = (IConversionManager)Kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey); 
    Kernel.HandlerRegistered += new HandlerDelegate(Kernel_HandlerRegistered);  
    } 

    void Kernel_HandlerRegistered(IHandler handler, ref bool stateChanged) 
    { 
    if (handler is ForwardingHandler) return; 

    var model = handler.ComponentModel; 

    if (model.Configuration == null) return; 

    var forward = model.Configuration.Children["forward"]; 
    if (forward == null) return; 

    foreach (var service in forward.Children) 
    { 
     Type forwardedType = (Type)conversionManager.PerformConversion(service, typeof (Type)); 
     Kernel.RegisterHandlerForwarding(forwardedType, model.Name); 
    } 
    } 
} 

이제
public interface IDog 
{ 
    void Bark(); 
} 

public interface IDuck 
{ 
    void Quack(); 
} 

public class Mutant : IDog, IDuck 
{ 
    public void Bark() 
    { 
    Console.WriteLine("Bark"); 
    } 

    public void Quack() 
    { 
    Console.WriteLine("Quack"); 
    } 
} 

것은 실제로 구성 : IDuck 및 IDog - 그리고 물론 우리는이 예를 들어 나는 두 개의 별도의 서비스를 지원하는 돌연변이 오리/개 구성 요소를 가지고거야, 코드에서이 사용을해야 용기 :

<castle> 
    <facilities> 
    <facility id="facility.handlerForwarding" type="Example.Facilities.HandlerForwardingFacility, Example" /> 
    </facilities> 
    <components> 
    <component id="mutant" service="Example.IDog, Example" type="Example.Mutant, Example"> 
     <forward> 
     <service>Example.IDuck, Example</service> 
     </forward> 
    </component> 
    </components> 
</castle> 

그리고 지금 우리는 행복과 같은 테스트를 실행할 수 있습니다 :이 도움이

WindsorContainer container = new WindsorContainer(new XmlInterpreter()); 

    var dog = container.Resolve<IDog>(); 
    var duck = container.Resolve<IDuck>(); 

    Assert.AreSame(dog, duck); 

희망을.

관련 문제