Sobes.tech
Middle+

Xizmatlarni aniqlash nima?

sobes.tech AI

AIdan javob

Service Locator - bu dizayn naqshidir, u xizmatlarga (belirli vazifalarni bajaradigan obyektlar) global kirish nuqtasini ta'minlaydi, mijoz kodidan bu xizmatlarning aniq amalga oshirish turlarini bilishni talab qilmaydi. U zarur bo'lgan xizmatni olish jarayonini inkapsulyatsiya qiladi.

Service Locator ning afzalliklari:

  • Markaziy kirish: Ilovaning istalgan joyidan xizmatlarga oson kirishni ta'minlaydi.
  • Moslashuvchanlik: Xizmatlarning amalga oshirishlarini o'zgartirishni osonlashtiradi, mijoz kodini o'zgartirmasdan.

Service Locator ning kamchiliklari (kritikaning asosiy sababi):

  • Yashirin bog'liqliklar: Mijoz kodi o'z bog'liqliklarini aniq e'lon qilmaydi, bu esa qaysi xizmatlar kerakligini tushunishni qiyinlashtiradi.
  • Test qilish: Service Locator ni ishlatadigan sinflarni test qilish qiyin, chunki bog'liqliklarni osonlik bilan almashtib bo'lmaydi (mock qilish mumkin emas).
  • DIP prinsipining buzilishi: Bog'liqliklarni konstruktor yoki xususiyatlar orqali olish o'rniga, sinf aktiv ravishda so'raydi.
  • Hayot aylanishini boshqarishdagi qiyinchiliklar: Service Locator ko'pincha ro'yxatdan o'tgan xizmatlarning hayot aylanishini boshqara olmaydi (masalan, singleton yoki transient obyektlar yaratish).

Oddiy amalga oshirish misoli:

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} turidagi xizmat allaqachon ro'yxatdan o'tgan.");
        }
        _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} turidagi xizmat topilmadi.");
    }
}

Foydalanish misoli:

// Xizmatni ro'yxatdan o'tkazish
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());

// Xizmatni olish
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");

Zamonaviy C# rivojlanishida Service Locator ko'pincha Inversion of Control (IoC) konteynerlar bilan almashtiriladi, ular to'liq Dependency Injection (DI) ta'minlaydi, bu esa bog'liqliklarni boshqarish va kodning test qilinishini yaxshilash uchun yanada afzalroq yondashuv hisoblanadi. IoC konteynerlar bog'liqliklarni aniq e'lon qilish va ularni avtomatik ravishda in'ektsiya qilish imkonini beradi, DIP tamoyillariga muvofiq.