Vkládání závislostí

Vkládání závislostí(anglickyDependency injection(DI)) je návrhový vzor, ve kterém objekt nebo funkce přijímá jiné objekty nebo funkce, na kterých závisí (říkáme jim závislosti nebo služby). Tento vzor, který je jednou z foremInversion of Control(IoC), říká, že příjemce by neměl vědět, jak tyto služby konstruovat nebo získávat. Místo toho mu je poskytuje externí kód ("injektor"). Dependency injection tak činí závislosti explicitními.
Pokud chce náš objekt používat služby jiného objektu (dále v textu jako komponenta) bez použití DI, pak zodpovídá za celý jeho životní cyklus, tedy inicializaci apod. Při aplikaci DI je ale náš objekt odstíněn od této správy, tu totiž zařizuje poskytovatel závislostí (anglickydependency provider) neboli kontejner. Nášobjekttedy potřebuje už jenreferencina poskytovatele závislostí, který mu je schopen dodat hned několik různých komponent splňujících očekávání našeho objektu. Každá z těchto komponent může našemu objektu poskytovat rozdílné služby a v tom spočívá síla DI.
DI zahrnuje nejméně dva objekty, které spolu musí spolupracovat. Konzument, tedy objekt požadující služby. Poskytovatele těchto služeb mu dodá DI provider, který ve skutečnosti zodpovídá za celý životní cyklus poskytovatele. Provider neboli injector může být implementován několika způsoby, např. jako lokátor služeb, abstraktní továrna, tovární metoda, nebo pomocí nějakého z řady zframeworků, napříkladSpring.
Martin Fowler poukazuje na tři různé vzory, jak lze objektu přidat externí referenci jiného objektu.
Příklad jednoduché injektáže si ukážeme na následujícím příkladě. Představte si člověka (konzumenta), který se chce stát florbalistou. K tomu, aby se jím mohl stát, potřebuje florbalovou hůl (požadovaná závislost). Obyčejný člověk si hůl neumí sám od sebe vyrobit.Programátormu ji musí dát do ruky. Řekněme, že se hůl vyrábí v továrně na hokejky. Člověk tedy nepotřebuje znát postup, ani umět si hůl vyrobit. Prostě si zajde k výrobci hokejek, nebo si ji dokonce objedná a výrobce mu ji dopraví až do rukou. Výrobce je schopen poskytnout několik odlišných druhů hokejek s rozdílnými vlastnostmi.
Ukázka rozhraní, které budou jednotlivé komponenty implementovat.
V tomto případě jsou všichni lidé od svého narození svázáni s konkrétní implementací hole. Existuje mezi nimi těsná závislost již v době překladu.
Toto řešení sice přesunulo otázku závislosti z Člověka na továrnu, v tomto případě na celou aplikaci, míra závislosti je však stále velká - již při překladu programu musí být známa konkrétní implementace hole.
Existuje několik různých frameworků, které jsou schopny řídit závislosti mezi komponentami. Vývojář si s jejich pomocí složí svou aplikaci z různých implementací komponent. O injektáž závislostí se v tomto případě stará kontejner, který si závislosti přečte z konfiguračních souborů, ve většině případů se pro tyto účely používá formátXML.
Zde již vidíme uvolněnou závislost. Žádná z komponent není v době překladu programu závislá na druhé. Při tvorbě nového florbalisty se využije služba „VytvorFlorbalistu“, kontejner frameworku se podívá do XML souboru, aby zjistil které konkrétní implementace Člověka a Hole má zvolit a sestaví mezi nimi závislost. Implementace lze měnit bez zásahu do kódu aplikace, stačí upravit konfigurační soubor.
Existuje mnoho variant jak přidat objektu závislost na druhý objekt. Záleží na vývojáři, který způsob vyhodnotí jako nejlepší pro svou aplikaci.
Prasanna, R.D.2009. Dependency Injection. Manning Publications Co. 2009.ISBN978-1-933988-55-9.