gpt4 book ai didi

.net - Unity 'GetAllInstances' 没有返回任何内容

转载 作者:行者123 更新时间:2023-12-02 05:29:18 25 4
gpt4 key购买 nike

我正在使用 Unity 来管理应用服务器上的服务,但由于某种原因,我无法使用“GetAllInstances”方法。奇怪的是,相同类型的“GetInstance”似乎工作正常!

这是配置:

<alias alias="IService" type="Atom.Server.Infrastructure.Interface.Service.IService, Atom.Server.Infrastructure.Interface"/>
<alias alias="IAtomCommandService" type="Atom.CommandServer.AtomCommandService.Interface.IAtomCommandService, Atom.CommandServer.AtomCommandService.Interface"/>
<alias alias="AtomCommandService" type="Atom.CommandServer.AtomCommandService.AtomCommandService, Atom.CommandServer.AtomCommandService"/>


<register type="IService" mapTo="AtomCommandService">
<lifetime type="Singleton"/>
</register>
<register type="IAtomCommandService" mapTo="AtomCommandService">
<lifetime type="Singleton"/>
</register>

这个想法是,当服务器启动时,我需要能够获取所有已配置的 IService 实例来初始化它们。

    IUnityContainer container = ConfigureUnityContainer();
UnityServiceLocator locator = new UnityServiceLocator(container);

var single = locator.GetInstance<IService>();
var all = locator.GetAllInstances<IService>().ToList();

正如我所说,single 可以工作,但 get all 不会返回任何内容。即使我从配置中删除 IAtomCommandService 映射并只使用 IService,它仍然无法工作。关于我哪里出错了有什么想法吗?

最佳答案

Unity 的工作方式是它只能接受给定抽象的一个未命名注册。 IIRC,如果您为同一接口(interface)注册另一个具体类型,则第二个将覆盖第一个。

因此,让多个服务实现相同类型的唯一方法是以不同的方式命名它们。尝试为每个 register 元素提供一个名称。

UnityContainer.ResolveAll 将返回所请求类型的所有命名注册,但不返回未命名注册(如果有的话)。

顺便说一句,不要使用 Service Locator anti-pattern .

关于.net - Unity 'GetAllInstances' 没有返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4689393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com