2009-03-26 8 views
6

Je souhaite configurer le conteneur Windsor afin qu'une seule instance de style singleton puisse fournir deux ou plusieurs services via le conteneur. J'ai trouvé qu'utiliser le même type dans plusieurs déclarations de composants (config XML) entraînerait la création d'une instance de ce type pour fournir l'interface de service de chaque composant, ce qui n'est pas le comportement que je souhaite.Comment configurer une instance de composant unique fournissant plusieurs services dans Castle.Windsor?

Par exemple:

interface IA { } 
interface IB { } 
class AB : IA, IB { ... } 

Je veux une instance de AB pour fournir à la fois les services IA et IB.

La raison spécifique pour laquelle je veux faire cela est que ma mise en œuvre DAO concrète étend plusieurs interfaces. D'un autre côté, j'ai plusieurs composants de travail qui contiennent une référence à différentes interfaces. L'instance concrète de DAO respecte cela, mais les constructeurs de ces composants distincts veulent l'implémentation de leurs interfaces séparées et je souhaite que Castle.Windsor transmette la même instance d'objet à ces conteneurs de travail via les demandes de service respectives.

lol, je pense que c'était clair comme de la boue! : P

Est-ce que quelqu'un comprend ce que je veux dire, et quelqu'un a-t-il des idées sur la façon dont je peux y parvenir grâce à la configuration XML des composants?

Répondre

3

Avez-vous vérifié la réponse à this question (en particulier le lien du forum) qui semble être ce que vous cherchez. Certains exemples utilisent le cycle de vie de Transient mais je pense que cela fonctionnera également avec Singleton.

Le principal pay-off de la forum post est:

container.Register(Component.For<IEntityIndexController, ISnippetController>() 
.ImplementedBy<SnippetController>() 
.LifeStyle.Transient); 

La solution est utilise l'interface fluide (et une version récente du tronc) et il n'a pas été possible de configurer en XML dernier j'ai vu. Cependant, il may be possible avec une facilité.

Bonne chance!

0

Vous pouvez enregistrer une instance d'un objet (au lieu d'une mise en œuvre) d'être responsable de différentes implémentations:

var ab = new AB(); 
    container.Register(Component.For<IA>().Instance(ab)); 
    container.Register(Component.For<IB>().Instance(ab)); 

Je crois que cela devrait fonctionner. Cependant, cela nécessite dans la configuration du code, pour des raisons apparentes.

+0

Le principal problème avec ceci est l'utilisation du "nouveau" opérateur, ce qui signifie que vous n'utilisez pas l'autowiring pour AB. –

+0

La dernière ligne doit être quelque chose comme 'container.Register (Component.For () .Instance (ab) .Named (" IBImplementation "));' ou vous obtiendrez _ComponentRegistrationException: Le composant AB n'a pas pu être enregistré. Il existe déjà un composant avec ce nom. _ – Lu55

1

Avez-vous essayé d'utiliser la méthode Forward:

container.Register(Component.For<IEntityIndexController>() 
.ImplementedBy<SnippetController>() 
.Forward (typeof(ISnippetController)) 
.LifeStyle.Transient); 

De mes expériences et de la documentation:

enregistrer les types de services pour le compte de cette composante

Je pense il devrait faire l'affaire.

+0

Y a-t-il un moyen de le faire à partir de la configuration XML? – Ash

+0

Je ne sais pas :( –

0

Je cherchais la même réponse, et ce post est le plus loin que je pouvais obtenir avec google.J'ai trouvé cela en utilisant

Classes.FromThisAssembly().Where(t => t.FullName == "Namespace.Classname").WithServiceAllInterfaces() 

Semble faire l'affaire pour moi.

Questions connexes