Ottenere l’unità per risolvere più istanze dello stesso tipo

Voglio fare una semplice risoluzione di registrazioni di tipo multiplo (alla fine iniettate dal costruttore, ma usando. Risolvi per vedere se Unity è anche capace di cose del genere.

In ogni caso di seguito, Unity risolve 0 elementi in cui dovrebbe essere risolto 2.

C’è qualche cambiamento nell’unità che triggers il comportamento post-2007? O sto semplicemente 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(); container.RegisterType(); // container.Resolve<IEnumerable>(); returns 0 // container.ResolveAll(); returns 0 var foos = container.Resolve(); Console.WriteLine(foos.Count()); Console.ReadLine(); } } 

In Unity può esistere solo una registrazione predefinita (registrazione senza nome come in container.RegisterType(); ). Se vengono eseguite più registrazioni predefinite, vince l’ultima.

Per registrare più implementazioni per la stessa interfaccia, è necessario assegnare nomi a tali registrazioni:

 container.RegisterType("registration1"); container.RegisterType("registration2"); 

Inoltre, Unity comprende solo gli array per impostazione predefinita. Se vuoi risolvere come array, allora starai bene con il comportamento predefinito. Altrimenti dovrai registrare una mapping tra l’array e la collezione che ti interessa, come:

 container.RegisterType, IFoo[]>(); 

Un’altra nota importante è che la registrazione predefinita non verrà restituita quando si risolve una raccolta. Per esempio dato:

 container.RegisterType(); container.RegisterType("registration1"); container.RegisterType("registration2"); container.RegisterType, IFoo[]>(); 

Se risolvi IEnumerable , il risultato conterrà solo istanze di Foo2 e Foo3 , ma non ci sarà un’istanza di Foo1 perché la registrazione predefinita non è inclusa.