Sobes.tech
Middle

K čemu slouží injekce závislostí?

sobes.tech AI

Odpověď od AI

Implementace závislostí (Dependency Injection, DI) se používá k řízení závislostí mezi komponentami aplikace.

Hlavní cíle DI:

  • Snížení propojenosti (Coupling): Komponenty nevytvářejí své závislosti přímo, ale získávají je zvenčí. To činí komponenty nezávislejšími a usnadňuje jejich opětovné použití.
  • Zlepšení testovatelnosti: Izolované testování jednotlivých komponent je jednodušší, protože lze použít mock objekty nebo záložky místo skutečných závislostí.
  • Zvýšení flexibility a rozšiřitelnosti: Snadnější je nahrazovat implementace závislostí bez změny kódu komponent, které je používají.
  • Zjednodušení konfigurace: Závislosti mohou být nakonfigurovány centrálně, například při spuštění aplikace.

Hlavní přístupy k DI:

  • Vkládání přes konstruktor (Constructor Injection): Závislosti jsou předávány jako parametry konstruktoru. Jedná se o nejrozšířenější a doporučený přístup, protože zaručuje přítomnost všech potřebných závislostí při vytváření objektu.

    // Závislost
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Komponenta se závislostí
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Vkládání přes konstruktor
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Doing something.");
        }
    }
    
  • Vkládání přes vlastnost (Property Injection): Závislosti jsou nastavovány přes veřejné vlastnosti. Méně preferované, protože nezaručuje, že závislost bude nastavena.

    public class MyService
    {
        public ILogger Logger { get; set; } // Vkládání přes vlastnost
    
        public void DoSomething()
        {
            Logger?.Log("Doing something."); // Kontrola na null
        }
    }
    
  • Vkládání přes metodu (Method Injection): Závislosti jsou předávány jako parametry metody. Používá se, když je závislost potřeba pouze pro vykonání konkrétní metody.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Vkládání přes metodu
        {
            logger.Log("Doing something.");
        }
    }
    

Často je DI realizováno pomocí DI kontejneru (Inversion of Control Container), který spravuje životní cyklus objektů a řeší jejich závislosti. Příklady populárních DI kontejnerů v .NET: Microsoft.Extensions.DependencyInjection (vestavěný), Autofac, Ninject, Castle Windsor.

DI je klíčovým principem pro tvorbu snadno udržovatelných, testovatelných a rozšiřitelných aplikací.