2009-06-29 2 views
12

ho una classe che accetta un array di interfacce nel costruttore:Castello di Windsor, non può iniettare una serie di tipi di interfaccia

public class Foo<T1, T2> : IFoo<T1, T2> 
{ 
    public Foo(IBar[] bars) 
    { 
     ... 
    } 
} 

mia registrazione contenitore si presenta come segue:

container.Register(AllTypes.Pick().FromAssemblyNamed("...") 
        .WithService.FirstInterface()); 
container.AddComponent("foo", typeof(IFoo<,>), typeof(Foo<,>)); 

I avere diverse implementazioni di IBar e il contenitore può definirle definitivamente, poiché chiamare ServiceLocator.Current.GetAllInstances<IBar>() funziona correttamente.

Tuttavia, se provo a ottenere un'istanza di IFoo, genera un'eccezione dicendo che non può soddisfare la deoendenza ... "che non è stata registrata".

Se cambio il costruttore per prendere una singola istanza di IBar, funziona correttamente.

Qualche idea?

risposta

23

Aggiungere l'ArrayResolver:

container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel)); 
+1

Vedi anche la FAQ Windsor: http://using.castleproject.org/display/IoC/FAQ –

+0

Può questo essere fatto tramite il file di configurazione, invece? –

+0

@Ben: non attualmente, ma è possibile consigliarlo su uservoice: http://castle.uservoice.com: "Aggiungi subresolvers tramite xml config" –