统一解析同一类型的多个实例

我想做一个简单的多种类型注册的解决方案(最终注入构造函数,但使用.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(); container.RegisterType(); // container.Resolve<IEnumerable>(); returns 0 // container.ResolveAll(); returns 0 var foos = container.Resolve(); Console.WriteLine(foos.Count()); Console.ReadLine(); } } 

在Unity中,只能有一个默认注册(没有名称的注册,如container.RegisterType(); )。 如果执行多个默认注册,则最后一个注册获胜。

为了为同一个接口注册多个实现,您需要为这些注册分配名称:

 container.RegisterType("registration1"); container.RegisterType("registration2"); 

此外,Unity默认只了解数组。 如果要将其解析为数组,则可以使用默认行为。 否则,您需要在数组和您感兴趣的集合之间注册映射,例如:

 container.RegisterType, IFoo[]>(); 

另一个重要注意事项是解析集合时不会返回默认注册。 例如给出:

 container.RegisterType(); container.RegisterType("registration1"); container.RegisterType("registration2"); container.RegisterType, IFoo[]>(); 

如果解析IEnumerable ,结果将只包含Foo2Foo3实例,但不会有Foo1的实例,因为不包括默认注册。