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í.