我正在使用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它仍然不起作用。关于我在哪里出错的任何想法?
答案 0 :(得分:8)
Unity的工作方式是它只能接受一个未命名的注册用于给定的抽象。 IIRC,如果你为同一个接口注册另一个具体类型,第二个会覆盖第一个。
因此,让多个服务实现相同类型的唯一方法是以不同的方式命名。尝试为每个register
元素提供名称。
UnityContainer.ResolveAll将返回所请求类型的所有命名注册,但不是未命名的注册(如果有的话)。
顺便说一句,请勿使用Service Locator anti-pattern。