2013-06-04 22 views
15

Ich will zu lösen eine einfache Entschlossenheit mehrerer Typ Registrierungen tun (schließlich injiziert Konstruktor, aber .Resolve zu sehen, ob die Einheit sogar in der Lage, solche Dinge ist.Erste Einheit mehrere Instanzen des gleichen Typs

In jedem Fall unten, löst Unity 0 Produkte, wo es 2.

Lösung sein sollte, ist es einige Schalter in der Einheit, die auf nach 2007 Verhalten dreht Oder bin ich nur drastisch etwas fehlt

Hier ist mein Code:?

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

Dies war das neueste Unity-Paket auf Nuget ab heute. –

Antwort

31

In Unity kann nur eine Standardregistrierung erfolgen (Eine Registrierung ohne Namen wie in container.RegisterType<IFoo, Foo1>(); ). Wenn mehrere Standardregistrierungen durchgeführt werden, gewinnt das letzte.

Um mehrere Implementierung für die gleiche Schnittstelle zu registrieren, müssen Sie Namen auf diese Vorgänge zuzuordnen:

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

auch nur Unity-Arrays standardmäßig verstehen. Wenn Sie als Array auflösen möchten, ist das Standardverhalten in Ordnung. Andernfalls müssen Sie eine Zuordnung zwischen dem Array registrieren und der Sammlung Sie interessiert sind, wie:

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

Ein weiterer wichtiger Hinweis ist, dass die Standard-Registrierung wird nicht zurückgegeben werden, wenn eine Sammlung zu lösen. Zum Beispiel gegeben:

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

Wenn Sie IEnumerable<IFoo> lösen, wird nur das Ergebnis enthalten Instanzen von Foo2 und Foo3, aber es wird keine Instanz von Foo1 sein, da die Standard Registrierung ist nicht inbegriffen.

+0

danke für die Klarheit! Das war sehr hilfreich. –

+0

@ S.Hebert froh zu helfen! Dieser Teil von Unity ist ziemlich verwirrend, um fair zu sein ... –

+0

In einer MVC-App ist es in Ordnung, 'var container = new UnityContainer();' und 'container.Resolve()' wo immer ich es will? Oder gibt es einen besseren Weg? – Narayana

Verwandte Themen