2009-01-27 12 views
5

Par exemple, j'ai deux interfaces: ICustomerService et IOrderService dont chacune a deux fonctions comme GetCustomer, GetOrder, etc.Comment Castle Windsor répond à une classe qui implémente plusieurs interfaces?

Je veux une classe pour implémenter les deux interfaces: serveur.

Comment Castle Windsor réagit-il? Est-il possible en premier lieu? Lorsque je résous l'objet Serveur basé sur l'une des deux interfaces, vais-je obtenir le même objet? Que se passe-t-il lorsque j'ai un constructeur qui a les deux interfaces dans ses paramètres? Y aura-t-il encore un objet construit?

en supposant que LifeStyle est laissé à sa valeur par défaut: Singleton.

Répondre

3

Avez-vous vérifié this post?

Here également

Forum post a également des informations sur ce

+1

Oui, je les ai vérifiés. Le premier message n'est pas le même que ma question, l'erreur dans le deuxième message est causée par une ancienne version de Castle. Le fichier de code de la publication contenant les tests est utile, il montre qu'un seul objet est utilisé. –

+1

Le message du forum a la solution –

+0

est un lien mort; [cette réponse] (http://stackoverflow.com/a/684392/322283) est utile; comme la réponse de Krysztof ci-dessous. – Marijn

3

Il n'y a personne à un disque correspondance entre un type CLR et un service Windsor ou d'un composant (glossary if needed is here).

donc vous pouvez avoir l'un des scénarios suivants:

  • De nombreux composants avec différents types de mise en œuvre d'exposer un seul service

    container.Register(
        Component.For<IFoo>().ImplementedBy<Foo1>(), 
        Component.For<IFoo>().ImplementedBy<Foo2>() 
    ); 
    
  • De nombreux composants avec le même type de mise en œuvre d'exposer un seul service

    container.Register(
        Component.For<IFoo>().ImplementedBy<Foo1>(), 
        Component.For<IFoo>().ImplementedBy<Foo1>().Named("second") 
    ); 
    
  • Homme Composants y avec le même type de mise en œuvre exposent différents services

    container.Register(
        Component.For<IFoo>().ImplementedBy<Foo1>(), 
        Component.For<IBar>().ImplementedBy<Foo1>().Named("second") 
    ); 
    
  • monocomposant exposer différents services

    container.Register(
        Component.For<IFoo, Bar>().ImplementedBy<Foo1>() 
    ); 
    

Comme vous pouvez le voir, oui - il est possible, et si vous ou non obtenir la même instance (en supposant que singleton) dépend de l'option que vous avez choisie - si les deux services seront exposés par le même composant, ou non.