2013-06-04 35 views
15

chcę zrobić prosty determinacji wielokrotnej rejestracji typu (ostatecznie konstruktor wstrzykuje, ale przy użyciu .Resolve aby zobaczyć czy Unity jest jeszcze zdolny do takich rzeczy.Pierwsze jedność rozwiązać wiele instancji tego samego typu

w każdym sprawa poniżej Unity postanawia 0 pozycji, gdzie powinno być rozwiązywanie 2.

Czy istnieje jakiś przełącznik w jedności, która włącza się zachowanie po 2007 Albo ja po prostu drastycznie brakuje czegoś

Oto mój kod:?

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

To był najnowszy pakiet Unity na Nuget od dzisiaj. –

Odpowiedz

31

W Unity może być tylko jedna domyślna rejestracja (rejestracja bez nazwy, jak w container.RegisterType<IFoo, Foo1>(); ). Jeśli wykonywana jest wielokrotna rejestracja domyślna, ostatnia wygrywa.

Aby zarejestrować wiele realizacji dla tego samego interfejsu, trzeba przypisać nazwy do tych rejestracji:

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

Również Unity zrozumieć tylko tablice domyślnie. Jeśli chcesz rozwiązać jako tablicę, będzie to w porządku z domyślnym zachowaniem. W przeciwnym razie trzeba będzie zarejestrować mapowania między tablicy i kolekcji jesteś zainteresowany, jak:

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

Kolejna ważna uwaga to, że rejestracja domyślna nie zostanie zwrócony podczas rozpoznawania kolekcję. Na przykład biorąc pod uwagę:

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

Jeśli rozwiązać IEnumerable<IFoo>, wynik będzie zawierał tylko instancje Foo2 i Foo3, ale nie będzie instancją Foo1 ponieważ rejestracja domyślna nie jest wliczony w cenę.

+0

dzięki za jasność! To było bardzo pomocne. –

+0

@ S.Hebert chętnie pomoże! Ta część Unity jest dość zagmatwana, aby być sprawiedliwym ... –

+0

W aplikacji MVC, czy można poprawnie używać 'var container = new UnityContainer();' i 'container.Resolve()' gdziekolwiek tego chcę? Czy istnieje lepszy sposób na zrobienie tego? – Narayana

Powiązane problemy