5

我正在使用统一来管理我的应用服务器上的服务,但由于某种原因,我无法让方法“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();

正如我所说,单曲有效,但 get all 没有任何回报。即使我从配置中删除了 IAtomCommandService 映射并且只拥有 IService 它仍然无法正常工作。关于我在哪里出错的任何想法?

4

1 回答 1

8

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

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

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

顺便说一句,不要使用Service Locator 反模式

于 2011-01-14T09:14:07.660 回答