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