Dependency Injection ve Scale na tři způsoby

Minulé úterý se konalo setkání Czech Scala Enthusiasts Group za účelem představení Dependency Injection (DI) frameworků a technik, které lze použít ve Scale.

Na půdě Fakulty informačních technologií ČVUT v Praze přivítal komunitu prof. Pavel Tvrdík, děkan fakulty, a popřál členům komunity i příznivcům funcionálního programování a Scaly z řad studentů příjemně strávený čas při společných setkáních, kterým univerzita zajistila potřebné zázemí.

Vlastimil Menčík nás seznámil s využitím Java frameworků Spring a Google Guice pro DI ve Scale, s implementací DI v projektu Spring Scala a možnostmi DI, které nabízí standard Contexts and Dependency Injection (CDI). Jakub Janeček pohovořil o nativním Scala řešení v podobě frameworku SubCut a Michal Příhoda nám představil řešení Cake patternem na úrovni samotného jazyka Scala. Vše bylo demonstrováno na příkladech týkajících se společné "Coffe Making" domény.

Celkově z přednášky vyplývá, že ani z použití existujících DI řešení určených primárně pro Javu nemusíme mít žádné zvláštní obavy, je ovšem dobré mít na paměti některá omezení, která vyplývají z podstaty frameworků, z obliby immutable objektů ve Scale a odlišných konvencí pro pojmenování vlastností objektů.

I. Použití Java DI frameworků

Spring Framework

  • Při použití Spring frameworku je vhodnější se orientovat na injektování závislostí do konstruktoru.
  • Injektování lze provést i pomocí setterů, ale to vzhledem k častému používání immutable objektů ve Scale není zcela typické (navíc je třeba, aby názvy setterů odpovídaly jmenným konvencím vlastností JavaBean).

Spring Scala

  • DI lze v projektu Spring Scala konfigurovat bez anotací, funkcionálním přístupem za použití konfiguračních tříd.
  • Různé implementace rozhraní mohou být sdružovány do různých konfigurací, konfiguraci lze použít k vytvoření aplikačního kontextu.

Google Guice

  • Google Guice nabízí neinvazivní lightweight řešení DI nejen pro Javu ale i pro Scalu.
  • Pro přirozenější použití ve Scale je nabízen jednoduchý wrapper (ScalaModule), ve kterém se definují implementace jednotlivých rozhraní, které lze později injektovat anotací @Inject.

Contexts and Dependency Injection (CDI)

  • CDI může být rovněž použito i ve Scale, zde je však třeba mít na paměti, že pro beany v session a singleton scope musí být CDI schopné vytvořit proxy, do kterých je možné injektovat beany s rozdílným životním cyklem (např. z request scope).
  • Aby bylo možné vytvořit tyto proxy, musí mít beana konstruktor bez parametrů.
  • Jinak je použití obdobné jako v případě Spring Frameworku.

II. SubCut

  • SubCut nabízí řešení šité na míru Scale, používá se kompoziční přístup bez anotací.
  • Třídy, do kterých se injektují závislosti, nejsou POJO, ale přijímají implicitní parametr BindingModule a mixují trait Injectable, který zpřístupňuje metody pro injektování.

III. Cake Pattern

  • Využívá pouze vlastností jazyka Scala: Mixování traitů a self reference v traitech.
  • Nejedná se o žádný framework a ve skutečnosti nedochází k flexibilnímu injektování samostatně zkonstruovaných objektů, které nabízí DI frameworky.
  • Z dosud představených řešení cake pattern jako jediný nabízí pospojování konkrétních implementací komponent s určitým rozhraním, jehož úspěšnost je kontrolovaná přímo kompilátorem.

Detailnější popis jednotlivých frameworků/technik naleznete v přednáškách, které jsou dostupné na stránkách skupiny Czech Scala Enthusiasts: 2013-01-di-in-scala.pdf, 2013-01-di-in-scala-cake.pdf. Zdrojové kódy příkladů jsou vystaveny na GitHubu a videozáznam prezentace je na youtube.

DI in Scala Presentation

Článek obsahuje 0 komentářů