Čo je to Dependency Injection?
Dependency Injection (DI) je návrhový vzor, ktorý sa používa na riadenie závislostí medzi objektami. Umožňuje, aby jedna trieda bola "závislá" od iných tried bez toho, aby ich musela priamo vytvárať alebo na nich byť priamo závislá. Namiesto toho sa závislosti "vstrekujú" do triedy z vonkajšieho prostredia.
Základná Myšlienka Dependency Injection
Predstavte si, že trieda A potrebuje na svoju činnosť objekt triedy B. Namiesto toho, aby si trieda A vytvorila novú inštanciu B (čo by znamenalo pevné spojenie medzi týmito dvoma triedami), použije Dependency Injection na získanie tejto závislosti. Táto závislosť sa môže poskytnúť buď cez konštruktor, vlastnosť, alebo metódu.
Typy Dependency Injection
1. Injekcia cez Konštruktor
Najčastejší a najodporúčanejší spôsob DI. Závislosť sa poskytne cez konštruktor triedy.
public class A
{
private readonly B _b;
public A(B b)
{
_b = b;
}
}
2. Injekcia cez Vlastnosť
Závislosť je poskytnutá pomocou nastaviteľnej vlastnosti.
public class A
{
public B B { get; set; }
}
3. Injekcia cez Metódu
Závislosť je odovzdaná cez parametre metódy.
public class A
{
public void SetDependency(B b)
{
// použitie objektu b
}
}
Výhody Dependency Injection
- Zlepšená Testovateľnosť: Pomocou DI je jednoduchšie testovať triedy, pretože môžu byť testované s falošnými závislosťami (
mockalebostub). To umožňuje vykonávať unit testy bez skutočných implementácií závislostí. - Uľahčená Údržba: Znížená prepojenosť (coupling) medzi komponentmi znamená, že je možné jednoduchšie vymeniť alebo upraviť implementáciu závislosti bez toho, aby sa to dotklo ostatných častí systému.
- Opätovná Použiteľnosť a Modularita: Vďaka explicitnému definovaniu závislostí môžu byť komponenty znovu použité vo viacerých kontextoch a projektoch.
Príklad Dependency Injection v ASP.NET Core
V ASP.NET Core sa DI používa na vkladanie služieb do controllerov a iných častí aplikácie pomocou registračného kontajnera.
Príklad registrácie služby v Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>(); // Transient závislosť
services.AddScoped<IScopedService, ScopedService>(); // Scoped závislosť
services.AddSingleton<ISingletonService, SingletonService>(); // Singleton závislosť
}
Použitie v kontroleri
public class HomeController : Controller
{
private readonly IMyService _myService;
public HomeController(IMyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
_myService.DoSomething();
return View();
}
}
Zhrnutie
Dependency Injection pomáha spravovať závislosti medzi triedami tak, aby boli tieto triedy menej prepojené, lepšie testovateľné a ľahšie udržiavateľné. To umožňuje aplikáciám byť modulárnejšími a prispôsobiteľnejšími na zmeny, čo je dôležité pri dlhodobom vývoji a údržbe softvéru. DI je základný princíp pri vývoji s použitím moderných frameworkov, ako napríklad ASP.NET Core, ktorý DI natívne podporuje.