Ce este un localizator de servicii?
sobes.tech AI
Răspuns de la AI
Service Locator este un pattern de proiectare care oferă un punct de acces global la servicii (obiecte care efectuează sarcini specifice), fără a necesita ca codul client să cunoască tipurile specifice de implementare ale acestor servicii. Acesta încapsulează procesul de obținere a serviciului necesar.
Avantajele Service Locator:
- Acces centralizat: Facilitează obținerea serviciilor din orice parte a aplicației.
- Flexibilitate: Permite schimbarea ușoară a implementărilor serviciilor fără a modifica codul client.
Dezavantajele Service Locator (motivul principal al criticilor):
- Dependențe ascunse: Codul client nu declară explicit dependențele sale, ceea ce face dificilă înțelegerea serviciilor necesare.
- Testabilitate: Este dificil să testezi clasele care utilizează Service Locator, deoarece dependențele nu pot fi ușor înlocuite (mocked).
- Încălcarea principiului inversiunii dependențelor (DIP): În loc să obțină dependențele prin constructor sau proprietăți, clasa le solicită activ.
- Dificultăți în gestionarea ciclului de viață: Service Locator nu poate gestiona adesea ciclul de viață al serviciilor înregistrate (de exemplu, crearea de singleton-uri sau obiecte transiente).
Exemplu de implementare simplă:
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($"Serviciul de tip {typeof(TService).Name} este deja înregistrat.");
}
_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($"Serviciul de tip {typeof(TService).Name} nu a fost găsit.");
}
}
Exemplu de utilizare:
// Înregistrarea serviciului
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());
// Obținerea serviciului
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");
În dezvoltarea modernă în C#, Service Locator este adesea înlocuit de utilizarea containerelor de Inversiune a Controlului (IoC), care oferă o Dependency Injection (DI) completă, considerată o abordare mai preferabilă pentru gestionarea dependențelor și pentru îmbunătățirea testabilității codului. Containerele IoC permit declararea explicită a dependențelor și injectarea automată a acestora, urmând principiile DIP.