2010-09-22 22 views
1

Dans une DLL, nous avons défini deux classes ("Class1" et "Class2") qui héritent d'une interface ("IInterface") et une classe de base ("BaseClass").Castle Fluent Registration: ne peut pas remplacer un type enregistré par "AllTypes" avec "Component"

Nous utilisons l'API d'inscription fluide de Castle Windsor (http://using.castleproject.org/display/IoC/Fluent+Registration+API) pour enregistrer automatiquement toutes les classes héritant de "BaseClass" (à l'intérieur de cette DLL) à leurs interfaces respectives. Pour la personnalisation spécifique, nous avons utilisé (depuis aujourd'hui) un fichier "castle.xml" qui remplace (avec les balises "component") les associations entre les interfaces et les classes concrètes (enregistrées par l'API Fluent Registration). Nous chargeons ce fichier xml dans le constructeur de WindsorContainer.

Le code est quelque chose comme ceci:

 //container's initialization: 
     var resource = new FileResource("Castle.xml"); 
     var interpreter = new XmlInterpreter(resource); 
     var container = new WindsorContainer(interpreter); 
     container.AddFacility<TypedFactoryFacility>(); 

     //... 

     //automatic type registration: 
     container.Register(
      AllTypes 
       .FromAssemblyContaining<BaseClass>() 
       .BasedOn<BaseClass>() 
       .WithService.Select(
        (t1, t2) => t1.GetInterfaces() 
            .Except(new[] {typeof (IDisposable)}) 
            .Union(new[] {t1})) 
       .Configure(a => a.Named(a.ServiceType.Name) 
            .LifeStyle.Transient) 
       .AllowMultipleMatches() 
      ); 

Par défaut, si nous demandons le château pour objet IInterface, nous obtenons "Class1"; pour obtenir "Class2", nous devons le spécifier dans le fichier "Castle.xml".

Aujourd'hui, j'ai essayé de se débarrasser de la castle.xml, en précisant les directives "composants" à l'intérieur de la configuration courant (avant que la directive "AllTypes"):

 container.Register(
      Component 
       .For<IInterface>() 
       .ImplementedBy<Class2>() 
       .LifeStyle.Transient); 

... mais nous toujours obtenir un objet Class1, comme si la directive "AllTypes" fluent remplacer la directive "Component" (et c'est étrange, car la directive "component" dans le fichier xml fonctionne).

Qu'est-ce que je fais mal?

EDIT: J'accédait à la composante par nom de clé « .Named() » a résolu le problème (grâce à Krzysztof):

 container.Register(
      Component 
       .For<IInterface>() 
       .ImplementedBy<Class2>() 
       .Named(typeof(IInterface).Name) 
       .LifeStyle.Transient); 
+2

Quelle version utilisez-vous? Êtes-vous sûr que tous les composants sont enregistrés au fur et à mesure que vous les enregistrez et que vous résolvez le composant par type et non par nom? –

+0

@Krzysztof: J'utilise v. 2.1.0.0 de Castle.Microkernel. En fait, nous utilisons "return _container.Resolve (clé, dictionnaire)" ... – Notoriousxl

+0

@Krzysztof: Named() a fonctionné à merveille, merci! Maintenant, je peux tuer toutes ces cordes magiques ... :) – Notoriousxl

Répondre

1

Pour que la question ne semble pas sans réponse, la La réponse est dans les commentaires ci-dessus.