Xidmət axtarıcı nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Service Locator dizayn nümunəsidir ki, müəyyən vəzifələri yerinə yetirən obyektlər (xidmətlər) üçün qlobal giriş nöqtəsi təmin edir və müştəri kodunun bu xidmətlərin konkret həyata keçirmə növlərini bilməsini tələb etmir. Bu, lazım olan xidməti əldə etmə prosesini kapsülləyir.
Service Locator-in üstünlükləri:
- Mərkəzləşdirilmiş giriş: Tətbiqin hər yerindən xidmətləri asanlıqla əldə etməyə imkan verir.
- Esneklik: Xidmətlərin həyata keçirilməsini asanlıqla dəyişdirməyə imkan verir, müştəri kodunu dəyişdirmədən.
Service Locator-in çatışmazlıqları (ən əsas tənqid səbəbi):
- Gizli asılılıqlar: Müştəri kodu öz asılılıqlarını açıq şəkildə bəyan etmir, bu da lazım olan xidmətləri anlamağı çətinləşdirir.
- Test ediləbilərlik: Service Locator istifadə edən sinifləri test etmək çətindir, çünki asılılıqlar asanlıqla dəyişdirilə bilməz (mock edilə bilər).
- DIP prinsipinin pozulması: Asılılıqları konstruktor və ya xüsusiyyətlər vasitəsilə almaq əvəzinə, sinif aktiv şəkildə tələb edir.
- Həyat dövrünün idarə olunmasında çətinliklər: Service Locator tez-tez qeydiyyatdan keçmiş xidmətlərin həyat dövrünü idarə edə bilməz (məsələn, singleton və ya transient obyektlər yaratmaq).
Sadə bir tətbiq nümunəsi:
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($"{typeof(TService).Name} tipli xidmət artıq qeydiyyatdan keçib.");
}
_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($"{typeof(TService).Name} tipli xidmət tapılmadı.");
}
}
İstifadə nümunəsi:
// Xidmətin qeydiyyatı
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());
// Xidmətin alınması
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");
Müasir C# inkişafında Service Locator tez-tez Inversion of Control (IoC) konteynerləri ilə əvəz olunur, bunlar tam bir Dependency Injection (DI) təmin edir və bu, asılılıqları idarə etmək və kodun test ediləbilərliyini artırmaq üçün daha üstün bir yanaşmadır. IoC konteynerləri asılılıqları açıq şəkildə bəyan etməyə və avtomatik olaraq injeksiya etməyə imkan verir, DIP prinsiplərinə uyğun olaraq.