2013-06-04 4 views
15

я хочу сделать простой решительность регистрации нескольких типов (в конечном счете конструктор впрыскивается, но с использованием .Resolve, чтобы увидеть, если Unity даже способен на такие вещи.Получение единства разрешить несколько экземпляров одного и того же типа

В каждом случай ниже, Unity решает 0 пунктов, где оно должно быть разрешающих 2.

есть ли какой-нибудь переключатель в единстве, который включает после 2007 поведение Или я просто резко что-то отсутствует

Вот мой код:?

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

Это был последний пакет Unity на Nuget на сегодняшний день. –

ответ

31

В Unity может быть только одна регистрация по умолчанию (регистрация без имени, как в container.RegisterType<IFoo, Foo1>(); ). Если выполняется несколько регистраций по умолчанию, выигрывает последняя.

Для того, чтобы зарегистрировать несколько реализаций на тот же интерфейс, вам нужно присвоить имена этих регистраций:

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

Кроме того, Unity понимают только массивы по умолчанию. Если вы хотите разрешить как массив, тогда вы будете в порядке с поведением по умолчанию. В противном случае вам нужно будет зарегистрировать отображение между массивом и коллекцией вы заинтересованы, как:

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

Другим важным отметить, что регистрация по умолчанию не будет возвращена при разрешении сбора. Например Дано:

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

Если разрешить IEnumerable<IFoo>, то результат будет содержать только экземпляры Foo2 и Foo3, но не будет являться экземпляром Foo1, потому что регистрация по умолчанию не включена.

+0

спасибо за ясность! Это было очень полезно. –

+0

@ S.Hebert рад помочь! Эта часть Unity довольно запутанна, чтобы быть справедливым ... –

+0

В приложении MVC можно ли использовать 'var container = new UnityContainer();' и 'container.Resolve()' где бы я ни хотел? Или есть лучший способ сделать это? – Narayana

Смежные вопросы