2008-11-08 16 views
9

J'ai une classe qui implémente plusieurs interfaces. Je voudrais enregistrer ces interfaces via XML. Tout ce que j'ai trouvé est une documentation pour la nouvelle interface Fluent. Cette option est-elle prise en charge via XML? En quoi consisterait l'ajout de cette fonctionnalité?Castle-Windsor prend en charge ForwardedTypes via la configuration XML

+0

Juste pour que vous sachiez, il est maintenant cuit dans le cadre. –

+0

@Krzysztof: J'ai besoin de cette fonctionnalité, et je préfère ne pas réinventer la roue. Malheureusement, je ne trouve rien sur ce sujet. Toute documentation ou liens concernant le transfert de type intégré via la configuration Xml? –

+0

johny g - c'est dans la documentation: http://www.castleproject.org/container/documentation/v21/manual/windsorconfigref.html –

Répondre

10

[Mise à jour] Ceci est maintenant possible dans Windsor 2.1 ou plus récent. Voir la documentation pour la syntaxe here.


Cette fonction n'a pas été mis en œuvre dans l'interpréteur XML pour l'instant .. mais il est difficile de ne pas ajouter le support via une installation (évidemment cette technique est également utile lorsque l'on veut ajouter d'autres fonctionnalités absentes l'analyseur de configuration existant).

Alors d'abord nous ajoutons une installation qui permet de détecter lorsqu'un gestionnaire est créé pour un type, et en même temps enregistrera l'un des services transmis afin qu'ils pointent vers le gestionnaire existant:

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

et puis bien sûr, nous devons utiliser ce dans le code, pour cet exemple, je vais avoir un composant de canard/chien mutant qui prend en charge deux services distincts - IDuck et 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"); 
    } 
} 

maintenant configurer réellement le conteneur:

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

Et maintenant, nous pouvons heureusement exécuter un test comme celui-ci:

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

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

    Assert.AreSame(dog, duck); 

Hope this helps.