ResolveAll是什么作用?

6
在IOC中,ResolveAll是什么意思?我知道官方答案是“解析与此类型匹配的所有有效组件。”这是否意味着它将返回实现给定接口的任何类?

在这个上下文中,IOC代表什么? - Captain Sensible
4个回答

10

它将返回已为给定接口注册的所有类。

...并且没有等待任何引用被解决。这个问题今天让我碰了一鼻子灰!


2
并不完全准确。它将返回已注册给定服务以及任何其他可分配服务的组件。因此,如果您请求 container.ResolveAll<IController>();,它也将返回注册为 IControllerWithCache 的服务。 - Krzysztof Kozmic
2
还有你提到的条件在v2.5中已经改变了。在v2.5中,Windsor将尝试解决等待依赖项的组件(如果依赖项是内联提供的或通过DynamicParameters提供的)。只有在这种尝试失败后,它才会忽略该组件并移动到下一个组件。 - Krzysztof Kozmic

2

使用Unity,ResolveAll将解析接口的每个已注册映射除了默认映射。

因此,如果您已注册:

container.RegisterType<IInterface, ActualClassOne>(new ContainerControlledLifetimeManager());
container.RegisterType<IInterface, ActualClassOne>("Singleton", new ContainerControlledLifetimeManager());
container.RegisterType<IInterface, ActualClassOne>("Trans", new TransientLifetimeManager());

ResolveAll()方法只会返回一个包含已解析的“Singleton”和“Trans”映射的IEnumerable。


4
为什么它会这样做?这一直让我很烦恼。 #Unity #失败 - RhysC
暗示不要使用未命名映射的微妙鼓励? - LukeN
啊嗯..问题是关于Castle-Windsor的 :) 不管怎样,那是非常重要的信息。也许考虑将其剪切并粘贴到一些与Unity相关的问题上?我敢打赌会有很多这样的问题。 - quetzalcoatl
我更倾向于引导人们使用Windsor、Ninject或其他好用的框架。我曾经卡在了Prism和Unity上。 - LukeN
1
以上的“除默认映射外”的部分非常重要。虽然这似乎是Unity的一个缺陷,但发现这一点对我有很大帮助! - Rob

1

它将返回为给定接口注册的所有类。


0
如果我有:
container.ResolveAll(new { argument = something}).Where(...)
似乎所有的T组件都会使用“something”实例化,即使不是所有的组件都满足where子句...谁来负责释放这些额外的组件?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接