Получение единства для разрешения нескольких экземпляров одного типа

Я хочу сделать простое решение для множественных регистраций типов (в конечном счете, введённого конструктора, но используя .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();

    }
}

Ответы

Ответ 1

В 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, потому что регистрация по умолчанию не включена.