2008-11-08 15 views
9

Tengo una clase que implementa múltiples interfaces. Me gustaría registrar estas interfaces a través de XML. Todo lo que he encontrado es documentación para la nueva interfaz fluida. ¿Esta opción es compatible a través de XML? ¿Qué implicaría agregar esta característica?Does Castle-Windsor admite ForwardedTypes a través de la configuración XML

+0

Para que lo sepas, ahora está integrado en el marco. –

+0

@Krzysztof: Necesito esta funcionalidad, y preferiría no reinventar la rueda. Lamentablemente, no puedo encontrar nada sobre esto en absoluto. ¿Alguna documentación o enlaces relacionados con el reenvío de tipos integrado a través de la configuración Xml? –

+0

johny g - está en la documentación: http://www.castleproject.org/container/documentation/v21/manual/windsorconfigref.html –

Respuesta

10

[Actualización] Esto ahora es posible en Windsor 2.1 o posterior. Consulte la documentación para la sintaxis here.


Esta característica no se ha implementado en el intérprete XML hasta el momento .. sin embargo, no es difícil añadir soporte para él a través de una instalación (obviamente, esta técnica también es útil cuando se quiere añadir otras características ausentes el analizador de configuración existente).

Así que antes que nada que añadir una instalación que detectará cuando se crea un controlador para un tipo, y al mismo tiempo se registrará cualquiera de los servicios reenviados para que apunten al controlador existente:

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); 
    } 
    } 
} 

y luego, por supuesto, tenemos que hacer uso de esta en el código, para este ejemplo voy a tener un componente de pato/perro mutante que soporta dos servicios separados - iDuck y idog:

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"); 
    } 
} 

Ahora para configurar realidad el contenedor:

<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> 

Y ahora felizmente podemos ejecutar una prueba como esta:

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

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

    Assert.AreSame(dog, duck); 

Espero que esto ayude.

Cuestiones relacionadas