34

Ho guardato allo Common Service Locator come un modo per astrarre il mio contenitore IoC ma ho notato che alcune persone sono fortemente contrarie a questo tipo di questo.Quando si utilizza il Local Service Service Locator?

Le persone consigliano di non utilizzarlo mai? Sempre usando? o a volte usandolo? Se a volte, in quali situazioni lo utilizzeresti e in quali situazioni non lo utilizzeresti.

+1

Sei alla ricerca di scenari di utilizzo per Common Service Locator in modo specifico o più generale per il modello di localizzazione del servizio? I termini non sono necessariamente intercambiabili ... – MattDavey

risposta

30

Immagina di scrivere codice di libreria per gli sviluppatori di terze parti. Il tuo codice deve essere in grado di creare oggetti di servizio forniti da questi sviluppatori. Tuttavia non sai quale contenitore IoC utilizzerà ciascuno dei tuoi chiamanti.

Il Local Service Locator consente di far fronte a quanto sopra senza forzare un determinato IoC sui propri utenti.

All'interno della libreria stessa è possibile che si desideri registrare le proprie classi in IoC, ora diventa molto più difficile in quanto è necessario scegliere un IoC per uso personale che non interferisca con i chiamanti.

+1

Vorrei solo aggiungere che potresti essere obbligato a usare CSL anche quando semplicemente non hai una radice di composizione comune o è fuori dal tuo controllo. Un esempio potrebbe essere un validatore di certificato personalizzato nel servizio WCF. –

8

Ultimamente ho letto alcuni concetti sul concetto di localizzatore di servizi. È un modo per aiutare a ridurre l'accoppiamento, ma richiede l'accoppiamento del codice al localizzatore - non il contenitore che supporta il localizzatore, ma il localizzatore stesso. È un compromesso, ma può essere utile nella giusta situazione.

Una situazione in cui può essere utile è quando si dispone di codice che non fa uso di DI, ad esempio codice legacy - Sono in questa barca ora. Tirare gli oggetti richiesti tramite SL, piuttosto che crearli direttamente, consente l'aggiunta di qualche astrazione. Lo vedo come un passaggio intermedio tra SL e DI/IoC.

+0

Con il codice legacy potresti non essere in grado di utilizzare l'iniezione del costruttore, quindi l'iniezione di proprietà può essere più appropriata. –

+2

La libreria Common Service Locator non riguarda solo lo schema Locator del servizio come ho cercato di spiegare nella mia risposta. – Steven

17

Ho notato che uno degli argomenti contro l'utilizzo del CSL è falso, perché gli sviluppatori pensano che questa libreria sia in grado di eseguire il modello di individuazione dei servizi. Questo tuttavia non è il caso, perché è facile utilizzarlo anche con il pattern Iniezione di dipendenza.

Tuttavia, la libreria CSL è stata appositamente progettata per i progettisti di framework che devono consentire agli utenti di registrare le dipendenze. Poiché la libreria chiamerà direttamente il CSL, dal punto di vista del framework stiamo parlando del pattern SL, da cui il suo nome.

Come progettista di framework, tuttavia, prendere una dipendenza dal CSL non dovrebbe essere presa alla leggera. Per l'usabilità del tuo framework è normalmente molto meglio avere il tuo meccanismo DI. Un meccanismo molto comune consiste nell'impostare le dipendenze nel file di configurazione. Questo modello è utilizzato in tutto il framework .NET. Quasi ogni dipendenza può essere sostituita con un'altra. Il modello di provider .NET è basato su questo.

Quando tu, come progettista di framework, fai una dipendenza dal CSL, sarà più difficile per gli utenti usare la tua applicazione. Gli utenti dovranno configurare un contenitore IoC e collegarlo al CSL. Tuttavia, non è possibile per il framework convalidare la configurazione come si può fare mentre si utilizza il sistema di configurazione .NET, che come tutti i tipi di supporto di convalida in esso.

+1

+1: questa è l'unica risposta perspicace qui. – MattDavey

0

Se si dispone di un codice di libreria che necessita di servizi e questo codice potrebbe essere ospitato nel contesto di un framework/runtime più grande, il framework/runtime dovrà fornire un meccanismo in cui è possibile eseguire un codice personalizzato all'avvio in cui è possibile inizializzare il contenitore e registrare le dipendenze. Un buon esempio di dove CSL può essere problematico è quando lo si utilizza nel contesto di MSCRM. È possibile eseguire una logica aziendale personalizzata registrando i plug-in che il framework MSCRM esegue su determinati eventi. Il problema che si verifica è dove si esegue la logica di registrazione poiché non vi è alcun evento di "avvio" a cui è possibile abbonarsi per configurare il contenitore DI.Anche se potresti in qualche modo configurare il tuo DI, dovrai mettere il CSL e le librerie DI nel GAC poiché questo è l'unico modo per chiamare il codice di terze parti da un plug-in (un altro elemento da aggiungere alla checklist di implementazione). In scenari come questo è meglio avere le proprie dipendenze come parametri del costruttore che il codice chiamante può inizializzare come meglio crede (tramite l'iniezione del costruttore o manualmente "aggiornando" l'implementazione dell'interfaccia appropriata).

Problemi correlati