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