Polopatě: dependency injection a service locator


Následující bude tak trochu „for dummies“. Ono totiž díky flexibilitě programovacích jazyků, jako je v tomto případě PHP, je docela problém vlastně celé problematice správně porozumět.

Než se začtete, je potřeba uvést, že nejsem žádný odborník na OOP ani na programování. Následující v jednoduchosti shrnuje to, co jsem se za posledních pár dnů pracně naučil. Totiž, když odborník píše manuál, automaticky předpokládá, že čtenář vlastně všechno ví a tak minimálně polovinu věcí neřekne, což je důvod, proč mi problematika DI trvala pochopit několik dní a to i s články od Davida Grudla, kterého jinak resektuji a považuji za jednoho z největších odborníků na PHP u nás. Pokud je něco v následujícím textu špatně, ocením upozornění v komentáři 🙂

Polopaticky, co je to ten dependency injection?

Je to technika, která slouží k předávání (injektování) závislostí v OOP. Každá třída si zpravidla v konstruktoru řekne o všechny závislosti. To je vše.

V praxi to vypadá takto. Třída A si v konstruktoru řekla o třídu DB, protože s ní bude pracovat. Tedy již nikde ve svém těle nebude volat klíčové slovo new. Všechno co potřebujete vytvořit budete dělat při spouštění aplikace nebo v Di kontejneru viz. dále.

Class A {
function __construct (DB $db)
{...}
}

Pro snadnější práci s DI je doporučeno používat tzv. Dependenci injection container, který se postará o vytvoření tříd a zabrání jejich dalšímu zbytečnému vytváření.

Jak vytvořit DI container?

Psát ho nemusíte,  můžete zkusit Nette DI, nebo třeba použít jednoduchý a přitom velmi hezký kód z článku Vlastní DI container s autowiringem.

Než se však pustíte do refaktoringu kódu a používání kontejneru, doporučuji přečíst si o DI kontejneru v článku od Davida Grudla. V článku se dozvíte, jak si udělat svůj jednoduchý kontejner a jak vlastně funguje.

Jaký je rozdíl mezi dependency injection a dependency injection containerem?

Rozdíl je ve slovíčku container. To se projeví tak, že se jednou vytvořené instance ukládají do pole a v případě potřeby se znovu již nevytváří nové.

Až následující odkaz mi pomohl pochopit celou problematiku https://stackoverflow.com/questions/38702676/what-is-a-dependency-injection-container

Pozor: DI neplést se service locatorem

Service locator je třída, která slouží ke skrývání závislostí. Funguje tak, že do ní natvrdo zadrátujete vytváření instancí pomocí klíčového slova new. Dle Davida Grudla se jedná o antipattern a neměli byste ho používat. S čímž souhlasím. Je to docela prasárna.