Unity 'GetAllInstances' ничего не возвращает - PullRequest
5 голосов
/ 14 января 2011

Я использую 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();

Как я уже сказал, сингл работает, но метод get all ничего не возвращает.Даже если я удалю отображение IAtomCommandService из конфигурации и просто получу IService, он все равно не будет работать.Любые идеи о том, где я иду с этим не так?

1 Ответ

8 голосов
/ 14 января 2011

Принцип работы Unity заключается в том, что он может принять одну безымянную регистрацию для данной абстракции.IIRC, если вы зарегистрируете другой конкретный тип для того же интерфейса, второй перезапишет первый.

Таким образом, единственный способ иметь несколько служб, реализующих один и тот же тип, - это назвать их по-разному .Попробуйте указать имя для каждого register элемента.

UnityContainer.ResolveAll вернет все именованные регистрации запрошенного типа, но не безымянная регистрация (если естьлюбой).

Кстати, не используйте анти-шаблон Service Locator .

...