2009-08-17 7 views
5

Est-il possible avec le conteneur Castle Windsor d'avoir un composant implémentant deux interfaces différentes et ensuite de le résoudre pour renvoyer la même instance de composant? Par exemple;Can castles windsor container retourne la même instance d'un composant implémentant 2 interfaces

var windsor = new WindsorContainer() 
    .AddComponent<InterfaceA, ClassAB>() 
    .AddComponent<InterfaceB, ClassAB>(); 

var classAB1 = windsor.Resolve<InterfaceA>(); 
var classAB2 = windsor.Resolve<InterfaceB>(); 

Assert.AreSame(classAB1, classAB2); 

Si j'essaie ce que je reçois une montré exception avec le message Il est un composant déjà inscrit au si je fournir des clés différentes clé, étant donné alors il retourne deux instances distinctes de la classe ClassAB.

Editer: Idéalement, je voudrais faire cela dans un fichier de configuration.

+0

Question ajoutée à la FAQ Windsor: http://using.castleproject.org/display/IoC/FAQ –

Répondre

11
[TestFixture] 
public class Forwarding { 
    public interface InterfaceA {} 

    public interface InterfaceB {} 

    public class ClassAB: InterfaceA, InterfaceB {} 

    [Test] 
    public void tt() { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<InterfaceA, InterfaceB>().ImplementedBy<ClassAB>()); 
     var a = container.Resolve<InterfaceA>(); 
     var b = container.Resolve<InterfaceB>(); 
     Assert.AreSame(a, b); 
    } 
} 
+0

Oh fils d'un b ... vraiment? Vous pouvez le faire? Seigneur connaît les solutions de contournement que j'ai trouvées. –

+0

Merci pour les réponses, cela semble bien, mais juste pour déplacer les messages de but savez-vous si cela est également possible de faire dans un fichier de configuration? – Gareth

+0

Oui, c'est possible. Voir http://stackoverflow.com/questions/274220 –

1

Je sais une solution à cette question - il peut être fait comme ceci:

var someInstance = new Instance(); 
var container = new WindsorContainer(); 

container.Register(Component.For(typeof(IFirstInterface)).Instance(someInstance)); 
container.Register(Component.For(typeof(ISecondInterface)).Instance(someInstance)); 

... mais vous perdez la capacité du conteneur à instancier la classe Instance, de sorte que ses dépendances ne seront pas automagiquement résolus. Bien sûr, si votre instance n'a aucune dépendance, cela ne vous intéresse probablement pas.

Questions connexes