我想对多个类型注册进行简单的解决(最终注入构造函数,但使用.Resolve来查看Unity是否能够执行此类操作。
在下面的每种情况下,Unity都会解析0应该解决的项目。
是否有一些统一的开关可以打开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 :(得分:34)
在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
的实例,因为默认注册不是包括在内。