nav line

Využití principů IoC/DI v moderních webových aplikacích aneb „dostaneš co potřebuješ“

Inversion of Control (IoC - „obrácené řízení“) je způsob vytváření programového kódu, kdy jeho potřebné závislosti jsou mu nastavovány z vnějšího prostředí, které jej využívá, namísto aby si je opatřoval resp. vytvářel sám. Programová prostředí (frameworky a aplikační servery) implementují podporu pro IoC podle návrhového vzoru Dependency Injection (DI - „vkládání závislostí“).

Dependency injection, tedy vkládání závislostí je v aplikačním prostředí podporujícím IoC obvykle úkolem specializované komponenty, tzv. DI kontejneru, která je implementací návrhového vzoru factory a která obstarává vytváření (poskytování) instancí opakovaně použitelných objektů, kterým pak předává potřebné závislé objekty jedním ze tří možných způsobů.

Možné způsoby injektování závislostí

  1. Constructor injection – závislosti se nastavují parametry konstruktoru
  2. Setter (property) injection – závislost se injektuje setterem nebo přímo setováním veřejné vlastnosti objektu (pokud daný programovací jazyk toto umožnuje)
  3. Interface injection – třída implementuje rozhraní, které definuje injektované závislosti ve formě setterů

Daný framework (kontejner) pak může podporovat jeden nebo více výše uvedených způsobů.

Velkou výhodou injektáže konstruktorem je garance dostupnosti všech potřebných závislostí již v okamžiku vytváření objektu. Construktor injection však může narážet na omezení životního cyklu objektů v aplikačních prostředích s omezenou životností objektů, kde může způsobovat problémy při jejich serializaci (pasivaci). V takových případech může být výhodnější setter/property injection, kdy členská pole (vlastnost) obsahující závislost jsou volatilní (neserializované) a framework zajistí jejich opětovné nastavení v rámci procesu deserializace (aktivace) objektu. Tento princip vkládání závislostí však nemůže garantovat nastavení všech závislosti ve stejným okamžiku (i když s tímto obvykle DI container nemá problém, ve vícevláknovém prostředí může vlákno nastavující závislosti být na objekt, na kterém se injektáž provádí synchronizováno) a může vyžadovat podporu pro implementaci post-create (post-init) metod, které nastaví (obnoví) stav objektu až poté, co mu byly všechny potřebné závilosti poskytnuty. Implementace takové „pozdní inicializaci“ (lazy initialization) vykonávající metody může též přimo souviset s uplatňováním návrhového vzoru „lazy loading“, kdy injektované komponenta se uvede do použitelného stavu až v okamžiku, kdy je na ní volána nějaká veřejná metoda. To je důležité zvláště v případě business komponent využívající externí (remote) zdroje (typicky připojení k síťové/databázové službě). Lazy loading též může implementovat přimo framework vkládáním závislostí ve formě proxy objektů, které instanciují (aktivují, deserializují) závislý objekt až v okamžiku volání nějaké metody, na který jsou následně veškerá volání delegována.

Protože DI se ve schématu třívrstvé architektury využívá zejména na aplikační vrstvě pro provázání jednotlivých samostatných business komponent závislostmi, DI kontejner funguje často také jako service locator (manager) nebo s ním úzce spolupracuje. Výhodná je dostupnost IoC též na prezentační vrstvě, která potřebuje přistupovat k business komponentám, tedy přímá podpora DI pro front controllery (presentery), pokud je daný webový framework vystavěn na principu MVC či pro komponentový model uživatelského rozhrání (UI).

DI může být řízena deklaratorně (např. za využití anotací nebo v samostatném konfigurační souboru ve formátu XML či YML) nebo konvencí (pojmenováním proměnných metod používaných sloužících injektáži).

Uplatnění principu CoC (Convention over Configuration) v implementaci DI v daném prostředí (frameworu) zjednodušuje a nevyžaduje pro zmapování závislostí komponent nic víc než jejich samotný zdrojový kód (deklarace metod resp. vlastností objektu). Uvedený princip je k vidění např. ve frameworkcích Grails nebo CMS LARS Vivo.

Výhody a rizika použití IoC

Mezi výhody patří:

  • Lepší přehlednost kódu – na první pohled je zřejmé, jaké má třída (objekt) závislosti vyžadující pro svoji funkčnost.
  • Jednodušší struktura aplikace – uplatňování principů IoC vede k vytváření opakovaně použitelných komponent.
  • Opakovaná použitelnost – třídy (komponenty) využívající DI pro nastavení závislostí jsou snadněji opakovaně použitelné v jiných prostředích či aplikacích.
  • Lepší testovatelnost – třídy napsané pro IoC se dají lépe testovat a lze pro ně vytvářet testovací mock objekty.

Nevýhody (rizika) jsou:

  • Pro vývojáře, který není s principy IoC obeznámen, může být zpočátku složitější se v takto napsaném kódu orientovat.
  • Využití DI kontejneru může mít vliv na rychlost aplikace, zvlášť v prostředích nepodporujících vícevláknové zpracování resp. aplikační scope, kde musí být závislosti mezi objekty vhodným způsobem cachovány.

Shrnutí

Aplikace principů IoC s podporou DI kontejneru je dnes víceméně standardem ve všech moderních aplikačních prostředích zaměřených na podporu rychlé tvorby webových aplikací a informačních systémů. Vývojáři využívající webové frameworky na platformě PHP mají dnes k dispozici podporou IoC ve většině rozšířených frameworků (Symfony2, Zend Framework 2, Nette) a aktivně ji mohou využívat ve spojení s podporou pro vytváření opakovaně použitelných komponent servisní (aplikační) vrstvy architektury webových systémů. Navzdory vyšším výpočetním nárokům představuje uplatnění IoC významný posun v kvalitě objektového kódu webových řešení.

Ohodnoťte článek

Využití principů IoC/DI v moderních webových aplikacích aneb „dostaneš co potřebuješ“

Související články

Vyhledávání na blogu

Webová integrace

Webová integrace jako nová oblast pro business „velkých" webových agentur.

o webové integraci

Profily blogujících