5

Ich benutze Einheit, um meine Dienste auf meinem App-Server zu verwalten, aber aus irgendeinem Grund kann ich nicht die Methode 'GetAllInstances' funktionieren. Das Seltsame ist, dass 'GetInstance' für den gleichen Typ gut zu funktionieren scheint! HierUnity 'GetAllInstances' gibt nichts zurück

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

Die Idee ist, dass, wenn der Server gestartet wird, muss ich alle konfigurierten Instanzen von IService erhalten können, um sie zu initialisieren.

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

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

Wie ich schon sagte, die Single funktioniert, aber die bekommen alle nichts zurück. Selbst wenn ich das IAtomCommandService-Mapping aus der Konfiguration entferne und nur den IService habe, funktioniert es immer noch nicht. Irgendwelche Ideen, wo ich falsch liege?

Antwort

8

Die Funktionsweise von Unity ist, dass es nur eine unbenannte Registrierung für eine gegebene Abstraktion akzeptieren kann. IIRC, wenn Sie einen anderen konkreten Typ für dieselbe Schnittstelle registrieren, überschreibt der zweite den ersten.

Die einzige Möglichkeit, mehrere Dienste zu implementieren, die denselben Typ implementieren, ist , benennen Sie sie anders. Versuchen Sie, für jedes register Element einen Namen anzugeben.

UnityContainer.ResolveAll kehren alle Namen Registrierungen des angeforderten Typs, aber nicht die unbenannte Registrierung (wenn es überhaupt).

BTW, verwenden Sie nicht die Service Locator anti-pattern.

+0

Danke Mark - das habe ich gleich nach dem Stellen der Frage bemerkt! Immer den Weg! –