2009-12-03 8 views
4

Quand j'utilise cette inscription:Windsor Castle: UsingFactoryMethod ne peut pas instancier avec une erreur bizarre

container.Register(
    Component 
     .For<IFooFactory>() 
     .ImplementedBy<FooFactory>(), 
    Component 
     .For<IFoo>() 
     .UsingFactoryMethod(kernel => kernel.Resolve<IFooFactory>().CreateFoo()) 
); 

Je reçois cette exception:

Castle.MicroKernel.ComponentRegistrationException: Type MyNamespace.IFoo est abstrait. En tant que tel, il est impossible de instansiate comme la mise en œuvre du service MyNamespace.IFoo

Je ne suis pas vraiment sûr de ce que le problème est. Mais la trace de la pile montre que, dans « DefaultComponentActivator.CreateInstance() », la condition suivante réussit et l'erreur est renvoyée:

if (createProxy == false && Model.Implementation.IsAbstract) 

Ai-je besoin d'une procuration de quelque sorte ici? L'enregistrement est-il incorrect?

Répondre

10

À partir du message, il semble que vous n'avez pas enregistré le IFooFactory.

Vous devez également prendre en charge la méthode d'usine. Il suffit de l'appeler avant de faire l'enregistrement:

container.AddFacility<Castle.Facilities.FactorySupport.FactorySupportFacility>(); 
+0

Le IFooFactory a été enregistré. Il me manquait l'appel à AddFacility(). Merci! – shovavnik

+3

Notez que 'FactorySupportFacility' n'est plus nécessaire à partir de Windsor 2.5 (hourra!) –

+0

Merci beaucoup pour ça - ça me rendait fou! J'utilise une version plus récente de Windsor pour une solution différente et je ne me suis pas rendu compte que cela est nécessaire pour une version plus ancienne de Windsor. –