Middle+
Co je to service-locator?
sobes.tech AI
Odpověď od AI
Service Locator je návrhový vzor, který poskytuje globální přístupový bod ke službám (objektům, které vykonávají určité úkoly), aniž by klientský kód musel znát konkrétní typy implementací těchto služeb. Zabaluje proces získání potřebné služby.
Výhody Service Locator:
- Centralizovaný přístup: Zjednodušuje získávání služeb odkudkoli v aplikaci.
- Flexibilita: Umožňuje snadno měnit implementace služeb bez změny klientského kódu.
Nevýhody Service Locator (hlavní důvod kritiky):
- Skryté závislosti: Klientský kód neuvádí své závislosti explicitně, což ztěžuje pochopení, jaké služby jsou potřeba.
- Testování: Je složité testovat třídy využívající Service Locator, protože závislosti nelze snadno nahradit (mockovat).
- Porušení principu inverze závislostí (DIP): Místo získávání závislostí přes konstruktor nebo vlastnosti je třída aktivně žádá.
- Těžkosti s řízením životního cyklu: Service Locator často neumí řídit životní cyklus registrovaných služeb (například vytváření singletonů nebo transient objektů).
Příklad jednoduché implementace:
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.");
}
}
Příklad použití:
// Registrace služby
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());
// Získání služby
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");
V moderním C# vývoji je Service Locator často nahrazován použitím Inversion of Control (IoC) kontejnerů, které poskytují plnohodnotnou Dependency Injection (DI), což je vhodnější přístup pro správu závislostí a zvýšení testovatelnosti kódu. IoC kontejnery umožňují explicitně deklarovat závislosti a automaticky je vkládat, následujíc principy DIP.