Sobes.tech
Middle

Milleks kasutatakse sõltuvuste sisestamist?

sobes.tech AI

Vastus AI-lt

Sõltuvuste süstimise (Dependency Injection, DI) kasutatakse sõltuvuste haldamiseks rakenduse komponentide vahel.

DI peamised eesmärgid:

  • Vähendada sidusust (Coupling): Komponendid ei loo oma sõltuvusi otse, vaid saavad need väljastpoolt. See muudab komponendid sõltumatumaks ja lihtsustab nende korduvkasutust.
  • Parandada testitavust: Eraldiseisvate komponentide testimine muutub lihtsamaks, kuna saab kasutada mock-objekte või asendajaid reaalse sõltuvuse asemel.
  • Suurendada paindlikkust ja laiendatavust: On lihtsam asendada sõltuvuste realiseeringuid ilma koodi muutmata.
  • Lihtsustada konfiguratsiooni: Sõltuvused võivad olla konfigureeritud tsentraliseeritult, näiteks rakenduse käivitamisel.

DI peamised lähenemised:

  • Konstruktoripõhine süstimine (Constructor Injection): Sõltuvused edastatakse konstruktorile parameetritena. See on kõige levinum ja soovitatav lähenemine, kuna see tagab kõikide vajalike sõltuvuste olemasolu objekti loomisel.

    // Sõltuvus
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Komponent sõltuvusega
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Konstruktoripõhine süstimine
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Doing something.");
        }
    }
    
  • Omaduse kaudu süstimine (Property Injection): Sõltuvused määratakse avalike omaduste kaudu. Vähem soovitatav, kuna see ei taga sõltuvuse olemasolu.

    public class MyService
    {
        public ILogger Logger { get; set; } // Omaduse kaudu süstimine
    
        public void DoSomething()
        {
            Logger?.Log("Doing something."); // Nullkontroll
        }
    }
    
  • Meetodi kaudu süstimine (Method Injection): Sõltuvused edastatakse meetodi parameetritena. Kasutatakse, kui sõltuvus on vajalik ainult konkreetse meetodi täitmiseks.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Meetodi kaudu süstimine
        {
            logger.Log("Doing something.");
        }
    }
    

DI realiseeritakse sageli DI konteinerite (Inversion of Control Container) abil, mis haldab objektide elutsüklit ja lahendab nende sõltuvused. Näited populaarsetest DI konteineritest .NET-is: Microsoft.Extensions.DependencyInjection (sisseehitatud), Autofac, Ninject, Castle Windsor.

DI on võtmeprintsiip, mis võimaldab ehitada kergesti hooldatavaid, testitavaid ja laiendatavaid rakendusi.