Sobes.tech
Middle

Na čo sa používa injekcia závislostí (Dependency Injection)?

sobes.tech AI

Odpoveď od AI

Implementácia závislostí (Dependency Injection, DI) sa používa na riadenie závislostí medzi komponentami aplikácie.

Hlavné ciele DI:

  • Zníženie prepojenosti (Coupling): Komponenty ne vytvárajú svoje závislosti priamo, ale ich získavajú zvonku. To robí komponenty nezávislejšími a uľahčuje ich opätovné použitie.
  • Zlepšenie testovateľnosti: Izolované testovanie jednotlivých komponentov je jednoduchšie, pretože je možné použiť mock objekty alebo záložky namiesto skutočných závislostí.
  • Zvýšenie flexibility a rozšíriteľnosti: Jednoduchšie je nahrádzať implementácie závislostí bez zmeny kódu komponentov, ktoré ich používajú.
  • Zjednodušenie konfigurácie: Závislosti môžu byť nakonfigurované centralizovane, napríklad pri spustení aplikácie.

Hlavné prístupy k DI:

  • Vkladanie cez konštruktor (Constructor Injection): Závislosti sa odovzdávajú ako parametre konštruktora. Ide o najrozšírenejší a odporúčaný prístup, pretože zaručuje prítomnosť všetkých potrebných závislostí pri vytváraní objektu.

    // Závislosť
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Komponenta so závislosťou
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Vkladanie cez konštruktor
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Doing something.");
        }
    }
    
  • Vkladanie cez vlastnosť (Property Injection): Závislosti sa nastavujú cez verejné vlastnosti. Menej preferované, pretože nezaručuje, že závislosť bude nastavená.

    public class MyService
    {
        public ILogger Logger { get; set; } // Vkladanie cez vlastnosť
    
        public void DoSomething()
        {
            Logger?.Log("Doing something."); // Kontrola na null
        }
    }
    
  • Vkladanie cez metódu (Method Injection): Závislosti sa odovzdávajú ako parametre metódy. Používa sa, keď je závislosť potrebná iba na vykonanie konkrétnej metódy.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Vkladanie cez metódu
        {
            logger.Log("Doing something.");
        }
    }
    

Často je DI realizované pomocou DI kontajnera (Inversion of Control Container), ktorý spravuje životný cyklus objektov a rieši ich závislosti. Príklady populárnych DI kontajnerov v .NET: Microsoft.Extensions.DependencyInjection (vestavěný), Autofac, Ninject, Castle Windsor.

DI je kľúčovým princípom pre tvorbu ľahko udržiavateľných, testovateľných a rozšíriteľných aplikácií.