如何从Unity容器中按名称获取所有类型的实例?

时间:2012-10-05 11:46:42

标签: c# .net dependency-injection inversion-of-control unity-container

我有一个包含一些注册实例的容器,如:

container.RegisterInstance(typeof(Interface1), "Mapping1", new Class1("1"))
         .RegisterInstance(typeof(Interface1), "Mapping1", new Class1("2"))
         .RegisterInstance(typeof(Interface1), "Mapping2", new Class1("3"))
         .RegisterInstance(typeof(Interface1), "Mapping2", new Class1("4"));

那么如何才能获得所有类型为Interface1的实例,例如" Mapping1"? 调用代码将是这样的:

var instances = container.ResolveAll<Interface1>("Mapping1");

感谢您的回答。

4 个答案:

答案 0 :(得分:4)

您不能使用相同的名称和类型组合进行多次注册。每个新注册都将覆盖之前的注册。

答案 1 :(得分:3)

我不确定注册这样的实例会产生你想要的结果。 RegisterInstance 将对象注册为单例,因此根据定义,您不能拥有多个具有相同名称的单例。从上面提供的示例中, container.ResolveAll()只返回2个实例。

答案 2 :(得分:0)

您可以创建一个扩展方法来处理此问题。看看这篇文章。它帮助了我,我认为它回答了你的问题: Unity - ResolveAll by name with condition

答案 3 :(得分:0)

我认为我在this unity container wiki page中发现了这个问题的新答案,对于以下情况:

RegisterType(typeof(IService), typeof(Service));
RegisterType(typeof(IService), typeof(Service),  "Name-1");
RegisterType(typeof(IService), typeof(Service1), "Name-2");
RegisterType(typeof(IService), typeof(Service1), "Name-3");
RegisterType(typeof(IService), typeof(Service1), "Name-4");

历史上,在调用ResolveAll<IService> (Resolve<IService[]>)时,Unity只返回4个项目, '名称-x',但现在,已添加了对IEnumerable <>的支持。如 反对ResolveAll,解决 Resolve<IEnumerable<SomeType>>()将返回所有注册 令人满意的IService。因此,在上面的示例中,它将返回所有5 对象。

我知道这不是相同的代码,因为您正在注册实例而不是类型,但是无论如何它可能会有所帮助,我尚未对其进行测试。