¿Qué es un localizador de servicios?
sobes.tech AI
Respuesta de la IA
Service Locator es un patrón de diseño que proporciona un punto de acceso global a los servicios (objetos que realizan tareas específicas), sin requerir que el código cliente conozca los tipos específicos de implementación de estos servicios. Encapsula el proceso de obtención del servicio necesario.
Ventajas de Service Locator:
- Acceso centralizado: Facilita la obtención de servicios desde cualquier lugar de la aplicación.
- Flexibilidad: Permite cambiar fácilmente las implementaciones de los servicios sin modificar el código cliente.
Desventajas de Service Locator (la principal razón de las críticas):
- Dependencias ocultas: El código cliente no declara explícitamente sus dependencias, lo que dificulta entender qué servicios son necesarios.
- Pruebas: Es difícil probar clases que usan Service Locator, ya que las dependencias no pueden ser fácilmente sustituidas (mocked).
- Violación del principio de inversión de dependencias (DIP): En lugar de obtener dependencias a través del constructor o propiedades, la clase las solicita activamente.
- Dificultades en la gestión del ciclo de vida: Service Locator a menudo no puede gestionar el ciclo de vida de los servicios registrados (por ejemplo, crear singleton o objetos transitorios).
Ejemplo de implementación sencilla:
public static class ServiceLocator
{
private static Dictionary<Type, object> _services = new Dictionary<Type, object>();
public static void RegisterService<TService>(TService serviceInstance) where TService : class
{
if (_services.ContainsKey(typeof(TService)))
{
throw new InvalidOperationException($"Service of type {typeof(TService).Name} already registered.");
}
_services[typeof(TService)] = serviceInstance;
}
public static TService GetService<TService>() where TService : class
{
if (_services.TryGetValue(typeof(TService), out object service))
{
return (TService)service;
}
throw new InvalidOperationException($"Service of type {typeof(TService).Name} not found.");
}
}
Ejemplo de uso:
// Registro del servicio
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());
// Obtención del servicio
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");
En el desarrollo moderno en C#, Service Locator a menudo es reemplazado por el uso de contenedores de Inversión de Control (IoC), que proporcionan una inyección de dependencias (DI) completa, siendo esta una aproximación más preferible para gestionar dependencias y mejorar la testabilidad del código. Los contenedores IoC permiten declarar explícitamente las dependencias y auto-inyectarlas, siguiendo los principios de DIP.