Unity“获取所有实例”不返回任何东西

发布于 2024-10-11 23:59:45 字数 1273 浏览 2 评论 0原文

我正在使用 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,它仍然无法工作。关于我哪里出错了有什么想法吗?

I'm using unity to manage my services on my app server but for some reason I can't get the method 'GetAllInstances' to work. The weird thing is that 'GetInstance' for the same type seems to work fine!

Here is the config:

<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>

The idea being that when the server starts, I need to be able to get all configured instances of IService to initialise them.

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

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

As I say, the single works, but the get all returns nothing. Even if I remove the IAtomCommandService mapping from the config and just have the IService it still doesn't work. Any ideas on where I'm going wrong with this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

是伱的 2024-10-18 23:59:45

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

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

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

顺便说一句,不要使用服务定位器反模式

The way Unity works is that it can only accept one unnamed registration for a given abstraction. IIRC, if you register another concrete type for the same interface, the second overwrites the first.

So the only way to have multiple services implementing the same type is to name them differently. Try providing a name for each register element.

UnityContainer.ResolveAll will return all named registrations of the requested type, but not the unnamed registration (if there's any).

BTW, don't use the Service Locator anti-pattern.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文