5

Uso l'unità per gestire i miei servizi sul mio server delle app, ma per qualche motivo non riesco a far funzionare il metodo 'GetAllInstances'. La cosa strana è che "GetInstance" per lo stesso tipo sembra funzionare bene!Unity 'GetAllInstances' non restituisce nulla

Ecco la configurazione:

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

L'idea è che quando il server si avvia, ho bisogno di essere in grado di ottenere tutte le istanze configurate di IService per inizializzare loro.

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

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

Come ho detto, il singolo funziona, ma il risultato non restituisce nulla. Anche se rimuovo il mapping IAtomCommandService dalla configurazione e ho solo l'IService, non funziona ancora. Qualche idea su dove sto andando male con questo?

risposta

8

Il modo in cui Unity funziona è che può accettare solo una registrazione senza nome per una data astrazione. IIRC, se si registra un altro tipo concreto per la stessa interfaccia, il secondo sovrascrive il primo.

Quindi, l'unico modo per avere più servizi che implementano lo stesso tipo è quello di denominare in modo diverso. Prova a fornire un nome per ogni elemento register.

UnityContainer.ResolveAll torneranno tutti registrazioni di nome del tipo richiesto, ma non la registrazione senza nome (se c'è ne sono).

BTW, non utilizzare Service Locator anti-pattern.

+0

Grazie Mark - L'ho capito subito dopo aver postato la domanda! Sempre la strada! –

Problemi correlati