我有一个包含一些注册实例的容器,如:
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");
感谢您的回答。
答案 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 对象。
我知道这不是相同的代码,因为您正在注册实例而不是类型,但是无论如何它可能会有所帮助,我尚未对其进行测试。