2009-03-23 6 views
7

J'ai une classe que je veux avoir accès à mon conteneur IOC (Windsor), mais je ne veux pas garder une propriété statique IWindsorContainer qui traîne - je préférerais avoir le conteneur s'injecter dans toutes les classes qui nécessitent un IWindsorContainer en tant que dépendance du constructeur.IWindsorContainer en tant que paramètre d'une classe

Je l'ai fait avec Unity, mais quand j'essaie la même chose avec le conteneur Windsor, il me dit que IWindsorContainer n'est pas enregistré avec le conteneur. Je ne pense pas que je peux simplement enregistrer IWindsorContainer => WindsorContainer, parce que cela va provoquer le conteneur à créer une nouvelle (ou différente) instance de lui-même pour passer à ma classe, et cette instance n'aura pas tout mon d'autres types enregistrés avec. Je ne vois pas non plus un moyen de construire le conteneur, d'en enregistrer tous les types, puis d'enregistrer cette instance sur IWindsorContainer - toutes les méthodes d'enregistrement ne prennent que des types pour le service et l'implémentation - jamais une réelle instance concrète.

Répondre

8

Généralement, vous ne voulez pas injecter le conteneur dans les composants de votre application.

Voir ces questions (cette question est presque un double d'entre eux):

BTW: vous obtenez IKernel injection gratuitement, et vous pouvez registre IWindsorContainer:

container.Register(Component.For<IWindsorContainer>().Instance(container)); 
+0

IKernal a travaillé pour moi. Je n'avais pas besoin de tout le WindsorContainer pour ma classe. – DavGarcia

1

En général, comme mausch dit, réfléchir à deux fois avant de passer votre conteneur à votre composant. Avez-vous vraiment besoin d'avoir accès au conteneur?

Pour extraire les dépendances du conteneur, utilisez typed factories.

0

J'ai été tenté de le faire récemment. Je voulais être capable de créer plusieurs instances d'un service pendant la durée de vie d'un objet. L'enregistrement d'une usine serait préférable dans la mesure où la nécessité de la dépendance est plus claire. Mais créer une usine par service semblait être une douleur.

J'ai fini par utiliser quelque chose comme le code dans cet article: http://mikehadlow.blogspot.com/2010/01/10-advanced-windsor-tricks-1a-delegate.html. Supposons que vous ayez une classe qui a besoin de créer des instances de IService. L'article décrit une technique permettant à votre classe d'avoir une dépendance sur Func, et vous obtiendrez automatiquement une fabrique spécifique à cette classe.

Questions connexes