vieja pregunta, pero para el beneficio de los demás:
Si bien estoy totalmente de acuerdo con el mantra "servicio de localización es un anti-patrón", definitivamente hay excepciones a esta regla.
Cuando utiliza Dependency Injection (como Unity) entonces, sí, ciertamente no usa ServiceLocator y solo usa la inyección de constructor para todas sus clases de servicio. (Tampoco utilice "nuevo" para nada que no sea objetos de valor como DTO).
Sin embargo, hay casos donde simplemente no puede usar la inyección de constructor y entonces la única forma de obtener acceso a un servicio es utilice una solución alternativa para acceder directamente a su contenedor de Unity, y en tales casos, ServiceLocator es una buena forma estándar para lograrlo. Este es el caso cuando la clase no es instanciada por usted (o más específicamente, no está instanciada por Unity), sino por .NET Framework, por ejemplo.
Algunos ejemplos simples de donde ServiceLocator podría ser útil, es conseguir el acceso a los servicios registrados en el contenedor de la Unidad de:
- una implementación de un WCF IEndpointBehavior o IClientMessageInspector
- una implementación de un WPF IValueConverter
- o puede que no necesariamente quiera acceder a los "servicios" de la clase, pero simplemente desea escribir un código que pueda ser comprobado por la unidad, pero por alguna razón la clase no puede instalarse (o no fácil) porque normalmente sería construido por .NET Framework, s o extraes tu código personalizado en una clase que es comprobable y lo resuelves en la clase no comprobable usando ServiceLocator.
Tenga en cuenta que esta línea no es lo ideal:
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(Container));
La propiedad ServiceLocator.Current se va a ejecutar el delegado proporciona cada vez que acceda actual, es decir, un nuevo UnityServiceLocator se va a poner cada vez creado .En su lugar, probablemente desee hacer esto:
IServiceLocator locator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => locator);
He visto esto usado demasiado, en el Prism StockTrader RI, también usan el ServiceLocator con MEF. También tuve la impresión de que era un antipatrón, por lo que me sorprende verlo en un RI. Creo que esta es la misma implementación del patrón Localizador de servicio que el anti-patrón definido. – Lukazoid
Lo consiguió al revés: en su ejemplo, no es Unity el que está utilizando el localizador de servicios, sino que su código está conectado a asp.net mvc3 a través del localizador de servicios. Los debates sobre el patrón de Localizador de servicios son de naturaleza religiosa. El equipo asp.net mvc tuvo que proporcionar una forma de usar su contenedor DI favorito y esta es la forma en que lo implementaron. Piensa en alternativas. Aquí hay más información sobre el problema http://blog.ploeh.dk/2011/08/25/ServiceLocatorRolesVsMechanics.aspx –
@zespri - ¿entonces no todas las implementaciones de Unity usan un Localizador de servicios? –