2013-06-04 11 views
15

che voglio fare una semplice volontà di tipo registrazioni multiple (in ultima analisi costruttore iniettato, ma utilizzando .Resolve per vedere se l'unità è ancora capace di tali cose.Ottenere l'unità per risolvere istanze multiple dello stesso tipo

In ogni caso qui di seguito, unità risolve 0 articoli dove dovrebbe essere la risoluzione 2.

c'è qualche interruttore nella unità che si accende comportamento post-2007 o sto solo perdendo qualcosa drasticamente

Ecco il mio codice:??

public interface IFoo {} 
public class Foo1 : IFoo{} 
public class Foo2 : IFoo{} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IFoo, Foo1>(); 
     container.RegisterType<IFoo, Foo2>(); 

     // container.Resolve<IEnumerable<IFoo>>(); returns 0 
     // container.ResolveAll<IFoo>(); returns 0 

     var foos = container.Resolve<IFoo[]>(); 
     Console.WriteLine(foos.Count()); 

     Console.ReadLine(); 

    } 
} 
+0

Questo utilizzava l'ultimo pacchetto Unity su Nuget a partire da oggi. –

risposta

31

In Unity può essere presente una sola registrazione predefinita (registrazione senza nome come in container.RegisterType<IFoo, Foo1>(); ). Se vengono eseguite più registrazioni predefinite, vince l'ultima.

Al fine di registrare più di implementazione per la stessa interfaccia, è necessario assegnare i nomi a tali operazioni:

container.RegisterType<IFoo, Foo1>("registration1"); 
container.RegisterType<IFoo, Foo2>("registration2"); 

Inoltre, Unità comprendere solo gli array per impostazione predefinita. Se vuoi risolvere come array, allora starai bene con il comportamento predefinito. In caso contrario, è necessario registrare un mapping tra il campo e la collezione che ti interessa, come:

container.RegisterType<IEnumerable<IFoo>, IFoo[]>(); 

Un'altra nota importante è che la registrazione di default non verrà restituita quando si risolve una collezione. Per esempio dato:

container.RegisterType<IFoo, Foo1>(); 
container.RegisterType<IFoo, Foo2>("registration1"); 
container.RegisterType<IFoo, Foo3>("registration2"); 
container.RegisterType<IEnumerable<IFoo>, IFoo[]>(); 

Se si risolve IEnumerable<IFoo>, il risultato conterrà solo le istanze di Foo2 e Foo3, ma non ci sarà un caso di Foo1 perché la registrazione di default non è incluso.

+0

grazie per la chiarezza! E 'stato molto utile. –

+0

@ S.Hebert felice di aiutare! Quella parte dell'Unità è abbastanza confusa per essere equi ... –

+0

In un'app MVC, è corretto fare 'var container = new UnityContainer();' e 'container.Resolve()' ovunque lo desideri? O c'è un modo migliore per farlo? – Narayana

Problemi correlati