Sobes.tech
Middle+

Mis on teenuseotsija?

sobes.tech AI

Vastus AI-lt

Service Locator on disainimuster, mis pakub globaalset juurdepääsu punktile teenustele (objektidele, mis täidavad teatud ülesandeid), ilma et kliendikood peaks teadma nende teenuste konkreetseid realiseerimisliike. See kapseldab protsessi, kuidas saada vajalikku teenust.

Service Locator eelised:

  • Keskne juurdepääs: Lihtsustab teenuste saamist igast rakenduse kohast.
  • Paindlikkus: Võimaldab hõlpsasti muuta teenuste realiseeringuid ilma kliendikoode muutmata.

Service Locator'i puudused (peamine kriitika põhjus):

  • Peidetud sõltuvused: Kliendikood ei avalda oma sõltuvusi selgelt, mis raskendab mõistmist, millised teenused on vajalikud.
  • Testimine: On keeruline testida klasse, mis kasutavad Service Locatorit, kuna sõltuvusi ei saa hõlpsasti asendada (mocked).
  • DIP põhimõtte rikkumine: Selle asemel, et saada sõltuvusi konstruktorist või omadustest, küsib klass neid aktiivselt.
  • Elutsükli haldamise raskused: Service Locator ei pruugi osata hallata registreeritud teenuste elutsüklit (näiteks singletonite või transient objektide loomine).

Lihtne teostusnäide:

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($"Teenuse tüüp {typeof(TService).Name} on juba registreeritud.");
        }
        _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($"Teenuse tüüp {typeof(TService).Name} ei leitud.");
    }
}

Näide kasutamisest:

// Teenuse registreerimine
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());

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

Tänapäevases C# arenduses asendatakse Service Locator sageli Inversion of Control (IoC) konteineritega, mis pakuvad täielikku Dependency Injection (DI) funktsionaalsust, mis on parem lähenemine sõltuvuste haldamiseks ja koodi testitavuse suurendamiseks. IoC konteinerid võimaldavad selgelt deklareerida sõltuvusi ja automaatselt neid sisestada, järgides DIP põhimõtteid.