2010-04-08 6 views
4

Voici un extrait de code du projet AspComet qui fonctionne avec Autofac.Func <T> injection avec conteneur Windsor

public MessageBus(IClientRepository clientRepository, Func<IMessagesProcessor> messagesProcessorFactoryMethod) 
{ 
    this.clientRepository = clientRepository; 
    this.messagesProcessorFactoryMethod = messagesProcessorFactoryMethod; 
} 

Comment puis-je injecter "Func<IMessagesProcessor> messagesProcessorFactoryMethod" avec Windsor, est-il possible?

Merci.

Répondre

3
container.Register(Component.For<Func<Foo>>().Instance(f)); 

est ici un test unitaire de passage qui démontre le concept:

[TestMethod] 
public void Test2() 
{ 
    Func<string> f =() => "Hello world"; 

    var container = new WindsorContainer(); 
    container.Register(Component.For<Func<string>>().Instance(f)); 

    var resolvedFunc = container.Resolve<Func<string>>(); 

    Assert.AreEqual("Hello world", f()); 
} 
+0

Il fonctionne comme vous le suggérez, mais je devais revenir IMessagesProcessor du récipient alors je codé comme ceci: Func messagesProcessorFactoryMethod =() => container.Resolve (); Y a-t-il un meilleur moyen ou c'est le meilleur moyen? – yang

+3

Vous pouvez obtenir un comportement de type Autofac sans travail supplémentaire en utilisant le service personnalisé suivant: http://www.assembla.com/code/kkozmic/subversion/nodes/Garage/Castle.LightweightFactoryFacility Si vous ne voulez pas Pour utiliser l'installation, la solution que vous avez décrite dans le commentaire précédent est la voie à suivre. –

+1

À partir de la ligne de réseau (et à partir de la prochaine version 2.5), ce comportement est intégré, c'est-à-dire que vous n'aurez pas à enregistrer explicitement 'Func'. Le simple fait d'avoir le constructeur suffira à Windsor pour savoir quoi faire, et il fournira le délégué lui-même. –

5
Container.Register(
    Component.For<IMessagesProcessor>() 
      .ImplementedBy<MessagesProcessor>() 
      .Lifetime.Transient, 
    Component.For<Func<IMessagesProcessor>>() 
      .Instance(() => Container.Resolve<IMessagesProcessor>()) 
) 

Cela devrait faire l'affaire

0

Castle.Windsor 2.5+ est livré avec delegate-based factories support qui lui permet de résoudre un délégué pour vous sans inscription explicite.