Šta je servis-lokator?
sobes.tech АИ
Одговор од АИ
Service Locator je obrazac dizajna koji pruža globalnu tačku pristupa servisima (objektima koji obavljaju određene zadatke), ne zahtevajući od klijentskog koda da poznaje konkretne tipove implementacija tih servisa. On enkapsulira proces dobijanja potrebnog servisa.
Prednosti Service Locator-a:
- Centralizovani pristup: Olakšava dobijanje servisa sa bilo kojeg mesta u aplikaciji.
- Fleksibilnost: Omogućava lako menjanje implementacija servisa bez promene klijentskog koda.
Nedostaci Service Locator-a (glavni razlog kritike):
- Skriveni zavisnosti: Klijentski kod ne navodi svoje zavisnosti eksplicitno, što otežava razumevanje kojih servisa je potrebno.
- Testiranje: Teško je testirati klase koje koriste Service Locator, jer zavisnosti nije lako zameniti (mockovati).
- Prekršaj principa inverzije zavisnosti (DIP): Umesto da dobija zavisnosti putem konstruktora ili svojstava, klasa ih aktivno zahteva.
- Teškoće u upravljanju životnim ciklusom: Service Locator često ne može upravljati životnim ciklusom registrovanih servisa (npr. kreiranje singletona ili transient objekata).
Primer jednostavne implementacije:
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} već registrovan.");
}
_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} nije pronađena.");
}
}
Primer korišćenja:
// Registracija servisa
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());
// Dobijanje servisa
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");
U savremenom C# razvoju, Service Locator se često zamenjuje korišćenjem IoC kontejnera, koji pružaju punu Dependency Injection (DI), što je preporučljiviji pristup za upravljanje zavisnostima i povećanje testabilnosti koda. IoC kontejneri omogućavaju eksplicitno deklarisanje zavisnosti i automatsko njihovo ubrizgavanje, prateći principe DIP.