2009-05-20 7 views
3

Salut je suis en train d'injecter un dictionnaire d'interfaces, mais je reçois une erreur du château comme celui-ci: -Château de Windsor: - Injecter Dictionnaire des interfaces via la configuration

Castle.MicroKernel.SubSystems.Conversion.ConverterException: Aucun convertisseur inscrit pour gérer le type IFoo

Afin de contourner l'exception, j'ai dû créer un wrapper qui contenait une liste de l'interface Ifoo et la renvoyait en utilisant une propriété. L'emballage a ensuite été utilisé dans la configuration ==> dictionnaire au lieu du dictionnaire

Y at-il un moyen dans le château que je puisse avoir un dictionnaire d'interface au lieu de faire cette solution de contournement?

public interface IFoo {} 
public class Foo {} 
public class IfooWrapper { 
    IList<IFoo> container{get;set;} 
} 
+0

Dans ce dictionnaire, est le service de la clé ou la valeur? –

+0

le service est la valeur – user110190

Répondre

0

J'ai dû faire quelque chose de très similaire. Cependant, je pense qu'il a exposé un défaut de conception plus que toute autre chose. J'ai refacturé mon application afin qu'elle fasse ce que votre classe d'emballage fait comme son fonctionnement standard. Cela a drastiquement simplifié l'application.

C'était vraiment juste une question de faire les choses «Castle Windsor way» au lieu d'essayer d'adapter «ma façon» au modèle Castle Windsor. C'était assez humiliant de voir à quel point la façon Castle Windsor était plus facile et meilleure ...

Techniquement, ce n'est pas une solution au problème que vous avez posé, mais j'espère que cela vous aidera.

+0

hmm bien pas une solution, mais c'est ce que je pensais. Mais ce qui n'a pas de sens pour moi, c'est qu'une liste d'interfaces est permise alors qu'un dictionnaire d'interfaces ne l'est pas. La classe wrapper ajoute juste plus de bruit à la configuration. – user110190

6

Cela fonctionne très bien pour moi (Windsor 2.0):

namespace WindsorTests { 
    public interface IService {}  
    public class Service1 : IService {}  
    public class Service2 : IService {}  
    public class Consumer { 
     private readonly IDictionary<string, IService> services;  
     public IDictionary<string, IService> Services { 
      get { return services; } 
     }  
     public Consumer(IDictionary<string, IService> services) { 
      this.services = services; 
     } 
    }  

    [TestFixture] 
    public class WindsorTests {  
     [Test] 
     public void DictTest() { 
      var container = new WindsorContainer(new XmlInterpreter(new StaticContentResource(@"<castle> 
<components> 
    <component id=""service1"" service=""WindsorTests.IService, MyAssembly"" type=""WindsorTests.Service1, MyAssembly""/> 
    <component id=""service2"" service=""WindsorTests.IService, MyAssembly"" type=""WindsorTests.Service2, MyAssembly""/> 
    <component id=""consumer"" type=""WindsorTests.Consumer, MyAssembly""> 
     <parameters> 
      <services> 
       <dictionary> 
        <entry key=""one"">${service1}</entry> 
        <entry key=""two"">${service2}</entry> 
       </dictionary> 
      </services> 
     </parameters> 
    </component> 
</components> 
</castle>"))); 
      var consumer = container.Resolve<Consumer>(); 
      Assert.AreEqual(2, consumer.Services.Count); 
      Assert.IsInstanceOfType(typeof(Service1), consumer.Services["one"]); 
      Assert.IsInstanceOfType(typeof(Service2), consumer.Services["two"]); 
     } 
    } 
} 
+0

aha, ils auraient pu fixer cela dans windsor 2.0. J'utilise 1.0 rc 3 – user110190

+0

Désolé, je ne pense pas que cela fonctionne dans RC3 –

Questions connexes