1

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

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

4 回答 4

4

您不能有多个具有相同名称和类型组合的注册。每个新注册都会覆盖之前的注册。

于 2012-10-05T12:50:22.547 回答
3

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

于 2012-10-05T13:12:14.437 回答
0

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

于 2012-10-05T12:39:38.000 回答
0

我认为我在这个统一容器维基页面中找到了这个问题的新答案,其中,对于以下情况:

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 个项目,即带有“Name-x”的项目,但现在,已添加对 IEnumerable<> 的支持。与 ResolveAll 不同,解析 Resolve<IEnumerable<SomeType>>()将返回所有满足 IService 的注册。所以在上面的例子中,它将返回所有 5 个对象。

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

于 2020-09-25T07:31:43.543 回答