Unity'GetAllInstances'没有返回任何东西

时间:2011-01-14 08:55:37

标签: .net dependency-injection unity-container service-locator

我正在使用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();

正如我所说,单曲作品,但得到的一切都没有回报。即使我从配置中删除IAtomCommandService映射并且只是拥有IService它仍然不起作用。关于我在哪里出错的任何想法?

1 个答案:

答案 0 :(得分:8)

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

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

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

顺便说一句,请勿使用Service Locator anti-pattern