/ / Perché Unity utilizza un Service Locator? - asp.net-mvc-3, unità-contenitore, localizzatore di servizio

Perché Unity utilizza un localizzatore di servizi? - asp.net-mvc-3, unity-container, service-locator

Ho visto questa riga di codice in diversitutorial per l'utilizzo di Unity in asp.net mvc3. Ho avuto l'impressione che Service Locator sia un anti-pattern e non una buona pratica. Questo Service Locator è diverso dall'anti-pattern definito o questa riga di codice / questa implementazione è considerata una cattiva pratica?

ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(Container));

risposte:

1 per risposta № 1

È lo stesso anti-patten di cui la gente parla. Tutto ciò che la linea sta facendo è impostare il provider di localizzazione dei servizi su un'istanza di UnityServiceLocator, ovvero utilizzare l'implementazione Unity di ISerivceLocator. Se lo desideri, puoi avere la tua implementazione su IServiceLocator e utilizzarla al posto di UnityServiceLocator.

L'uso di Service Locator è considerato una cattiva pratica per vari motivi elencati Qui


11 per risposta № 2

Vecchia domanda, ma a beneficio degli altri:

Sebbene io sia assolutamente d'accordo con il mantra "La posizione del servizio è un anti-schema", ci sono sicuramente delle eccezioni a questa regola.

Quando si utilizza l'iniezione di dipendenza (come Unity)quindi, sì, certamente non usare ServiceLocator e usare solo l'iniezione del costruttore per tutte le classi di servizio.

Tuttavia, ci sono casi in cui non puoi semplicemente "tutilizzare l'iniezione del costruttore e quindi l'unico modo per ottenere l'accesso a un servizio è utilizzare una soluzione alternativa per accedere direttamente al contenitore Unity e, in questi casi, ServiceLocator è un buon metodo standard per farlo. Questo è il caso in cui la classe non è istanziata da te (o più specificamente, non è istanziata da Unity) ma dal framework .NET per esempio.

Alcuni semplici esempi di dove ServiceLocator potrebbe essere utile è ottenere l'accesso ai servizi registrati nel contenitore Unity da:

  1. un'implementazione di un WCF IEndpointBehavior o IClientMessageInspector
  2. un'implementazione di un IValueConverter WPF
  3. o potresti non voler nemmeno necessariamente ottenereaccesso ai "servizi" dalla classe, ma si desidera semplicemente scrivere codice che sia testabile in unità, ma per qualche motivo la classe non può essere affatto istituita (o non facilmente) perché sarebbe normalmente costruita da .NET Framework, in modo da estrarre il codice personalizzato in una classe che è testabile e risolverlo nella classe non testabile utilizzando ServiceLocator.

Nota che questa linea non è l'ideale:

ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(Container));

ServiceLocator.La proprietà Current eseguirà il delegato fornito ogni volta che accedi a Current, ovvero verrà creato un nuovo UnityServiceLocator ogni volta. Invece, probabilmente vorrai farlo:

IServiceLocator locator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => locator);

7 per risposta № 3

Se si crea un framework progettato per esserecontainer agnostic il localizzatore di servizi (anche se dovrebbe essere un No-Go in un'applicazione) è un ulteriore livello di riferimento indiretto che consente di scambiare Unity con qualcosa di diverso. Inoltre, l'uso del localizzatore di servizi non impone l'uso di DI per le applicazioni che utilizzano tale framework.