Middle+
Čo je to service-locator?
sobes.tech AI
Odpoveď od AI
Service Locator je vzor návrhu, ktorý poskytuje globálny prístupový bod ku službám (objektom, ktoré vykonávajú určité úlohy), bez toho, aby klientsky kód musel poznať konkrétne typy implementácií týchto služieb. On enkapsuluje proces získavania potrebnej služby.
Výhody Service Locator:
- Centralizovaný prístup: Uľahčuje získavanie služieb z akéhokoľvek miesta v aplikácii.
- Flexibilita: Umožňuje ľahko meniť implementácie služieb bez zmeny klientského kódu.
Nevýhody Service Locator (hlavný dôvod kritiky):
- Skryté závislosti: Klientsky kód neuvádza svoje závislosti explicitne, čo sťažuje pochopenie, aké služby sú potrebné.
- Testovanie: Je ťažké testovať triedy využívajúce Service Locator, pretože závislosti nie je možné ľahko nahradiť (mockovať).
- Porušenie princípu inverzie závislostí (DIP): Namiesto získavania závislostí cez konštruktor alebo vlastnosti ich trieda aktívne žiada.
- T difficulty s riadením životného cyklu: Service Locator často nevie riadiť životný cyklus registrovaných služieb (napríklad vytváranie singletonov alebo transientných objektov).
Príklad jednoduchého implementácie:
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 typu {typeof(TService).Name} je už zaregistrovaná.");
}
_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 typu {typeof(TService).Name} nebola nájdená.");
}
}
Príklad použitia:
// Registrácia služby
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());
// Získanie služby
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");
V súčasnej C# vývoji je Service Locator často nahradzovaný použitím IoC kontajnerov, ktoré poskytujú plnohodnotnú Dependency Injection (DI), čo je vhodnejší prístup na správu závislostí a zvýšenie testovateľnosti kódu. IoC kontajnery umožňujú explicitne deklarovať závislosti a automaticky ich vkladať, nasledovať princípy DIP.