Sobes.tech
Middle+

Kas yra paslaugų ieškiklis?

sobes.tech AI

Atsakymas iš AI

Service Locator yra projektavimo šablonas, kuris suteikia globalią prieigos tašką prie paslaugų (objektų, vykdančių tam tikrus uždavinius), nepareikalaujant iš kliento kodo žinoti konkrečius šių paslaugų įgyvendinimo tipus. Jis įkapsuliuoja procesą, kaip gauti reikalingą paslaugą.

Service Locator privalumai:

  • Centralizuotas prieigos taškas: Supaprastina paslaugų gavimą iš bet kurios programos vietos.
  • Lankstumas: Lengvai keičia paslaugų įgyvendinimus be kliento kodo keitimo.

Service Locator trūkumai (pagrindinė kritikos priežastis):

  • Paslėptos priklausomybės: Kliento kodas aiškiai neapibrėžia savo priklausomybių, tai apsunkina suprasti, kokios paslaugos yra reikalingos.
  • Testavimas: Sunku testuoti klases, naudojančias Service Locator, nes priklausomybės nėra lengvai pakeičiamos (mocked).
  • DIP principo pažeidimas: Vietoj to, kad gautų priklausomybes per konstruktorių ar savybes, klasė aktyviai jų prašo.
  • Gyvenimo ciklo valdymo sunkumai: Dažnai Service Locator nesugeba valdyti registruotų paslaugų gyvenimo ciklo (pavyzdžiui, kurti singletonus ar transient objektus).

Paprastas įgyvendinimo pavyzdys:

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($"Paslauga tipo {typeof(TService).Name} jau užregistruota.");
        }
        _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($"Paslauga tipo {typeof(TService).Name} nerasta.");
    }
}

Naudojimo pavyzdys:

// Paslaugos registravimas
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());

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

Šiuolaikinėje C# programavimo praktikoje Service Locator dažnai pakeičiamas naudojant IoC konteinerius, kurie teikia pilnavertę Dependency Injection (DI), kas yra geresnis būdas valdyti priklausomybes ir pagerinti kodo testavimą. IoC konteineriai leidžia aiškiai deklaruoti priklausomybes ir automatiškai jas įdiegti, laikantis DIP principų.