Play Framework 2.4 + ã³ã³ãã¤ã«æDIã§ Play Module ãå©ç¨ããæ¹æ³
Play Framework 2.4 ããªãªã¼ã¹ãããã®ã¯2015å¹´5æãªã®ã§ããã仿´æã¯ããã®ã§ããçµæ§ããã£ãï¼ããããããè¨äºãè¦å½ãããªãã£ãã®ã§ã¾ã¨ãã¦ãããã¨ã«ãã¾ãã
å¿ããäººã¯æå¾ã®ã¾ã¨ãã ãèªãã°OKãããããªãã§ãã
Play Framework 2.4 ã® Dependency Injection
Play Framework 2.4 ã§ã¯ Dependency Injection ï¼ä»¥ä¸DIï¼ããã¬ã¼ã ã¯ã¼ã¯ã§ãµãã¼ãããã¾ããã â¦â¦ã¨ãããããããã¬ã¼ã ã¯ã¼ã¯ã®æ¨æºæ©è½ã§ã¬ãããªå©ç¨ãããããã«ãªãã¾ããã
ããã¥ã¢ã«ãèªãã¨ã2種é¡ã®DIãæ¡å ããã¦ãã¾ãã
- Runtime Dependency Injectionï¼å®è¡æã®åçãªDIï¼
- Compile Time Dependency Injectionï¼ã³ã³ãã¤ã«æã®éçãªDIï¼
åè
㯠Google Guice ãå©ç¨ããå®è£
ã§ã@Singleton
ãã @Inject
ããã®ã¢ããã¼ã·ã§ã³ãããããåºã¦ãã¦ããã Java ã£ã½ãã§ãï¼Guice ã Java åããªã®ã§å½ããåã§ããï¼ã
DIã®æ¹æ³ã¯æè¬ãã³ã³ã¹ãã©ã¯ã¿DIãã§ãä¾åæ§ã®æ³¨å
¥å
ã¨ãªãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã®ãã©ã¡ã¼ã¿ã¨ãã¦ä¾åãããªãã¸ã§ã¯ããåãåãã¾ãã
誰ããã©ããã§è¨ã£ã¦ãã¾ãããè¨èªã¬ãã«ã§ã·ã³ã°ã«ãã³ãªãã¸ã§ã¯ããå®ç¾©ã§ãã Scala ã§ @Singleton
ã¨ããã¢ããã¼ã·ã§ã³ã«ã¯å°ãéåæãããã¾ãã
å¾è
ã¯ç¹ã«ããã¨è¨ã£ãæ©è½ãã©ã¤ãã©ãªã¯æ¨æºã§ã¯æä¾ããã¦ãããããã³ã³ãã¤ã«æã«å¥½ããªããã«DIããã°ãããããªããã¨ããã¹ã¿ã¤ã«ã§ãã
play.api.ApplicationLoader
ãç¶æ¿ããç¬èªã¯ã©ã¹ã使ããæ¨æºã®ãã®ã¨å·®ãæ¿ãããã¨ã§å®ç¾ãã¾ãã
詳ããæ¹æ³ãªã©ã¯ããã¥ã¢ã«ãåç
§ãã¦ãã ããã
åå®å ¨æå¾ã¨ãã¦ã¯ãã¡ããå¾è ã鏿ããã®ã§ãããããã«ãã£ã¦è¦å´ããã¨ããã話ã
Play Module ã«ã¤ãã¦
Play Framework 2.4 ã§ã¯DIã®ä»ã«ã大ããªå¤æ´ãããã¤ãããããã®ãã¡ã®ã²ã¨ã¤ã Plugin ã«ä»£ãã£ã¦ç»å ´ãã Module ã§ãã
Plugin 㯠play.api.Plugin
ãç¶æ¿ã play.plugins ã«è¨è¿°ãããã¨ã§å©ç¨ãã¦ãã¾ããã Module 㯠play.api.inject.Module
ãç¶æ¿ã application.conf ã«æ¬¡ã®ãããªè¨è¿°ããããã¨ã§å©ç¨ãããã¨ã«ãªãã¾ããã
play.modules.enabled += "my.module.MyModule"
ä»åå©ç¨ãããã¨ãã Module 㯠flyway-play 㨠scalikejdbc-play-support ã®2ã¤ã§ããããããã README ã«ã¦ä¸è¨ã®ãããªè¨å®ããããã¨ã§ä½¿ããâ¦â¦ã¨æ¡å ããã¦ãã¾ããã â¦â¦ããããã¯ããã¾ã§ Guice ã«ããå®è¡æDIãå©ç¨ãã¦ããå ´åã®ã¿ã®ã話ã ã£ããã¨ããããã§ãã
Play Module ãã©ã®ããã«èªã¿è¾¼ã¾ããã
ãã¦ãã¨ããããã§åã¢ã¸ã¥ã¼ã«ã libraryDependencies
ã«è¿½å ã㦠play.modules.enabled += ...
ãè¨è¿°ãã¦ãä¸åã«ã¢ã¸ã¥ã¼ã«ãåä½ãã¦ããæ§åããªããã¨ããããã¾ããã
æåã¯åå ãããããå³å¾å·¦å¾ãã¦ããã®ã§ãããã©ãã«ããªããªãã®ã§ Playframework ã®ã³ã¼ãã調ã¹ã¦ã¿ã¾ããã
ã¾ã㯠application.conf ã® play.modules.enabled
ãã©ãã§èªã¿è¾¼ã¾ãã¦ãããã§ãã
play.modules.enabled
ã§æ¤ç´¢ãã¦ã¿ã㨠Modules
ãªãã¸ã§ã¯ãã® locate
ã¡ã½ããã§è¨å®ãèªã¾ãã¦ããããã§ãã
def locate(environment: Environment, configuration: Configuration): Seq[Any] = { val includes = configuration.getStringSeq("play.modules.enabled").getOrElse(Seq.empty) val excludes = configuration.getStringSeq("play.modules.disabled").getOrElse(Seq.empty) ...
次㫠Modules.locate
ãã©ãã§å¼ã³åºããã¦ãããã§ããããã㯠GuiceableModule
ãªãã¸ã§ã¯ãã® loadModules
ã¡ã½ããã§ãã
def loadModules(environment: Environment, configuration: Configuration): Seq[GuiceableModule] = { Modules.locate(environment, configuration) map guiceable }
ãªãã¸ã§ã¯ãåã« Guice ã¨åºã¦ãã¦å«ãªäºæãâ¦â¦ã¨æã£ãã®ãæã®éãããã«è¾¿ã㨠GuiceApplicationBuilder
ãã㦠GuiceApplicationLoader
ã«è¾¿ãçãã¾ããã
ã¤ã¾ãã³ã³ãã¤ã«æDIã使ã£ã¦ç¬èªã® ApplicationLoader
ãå®ç¾©ãå©ç¨ãã¦ããå ´åã¯ããã application.conf ã«è¨è¿°ãã¦ã Module ãèªã¿è¾¼ã¾ãããã¨ã¯ãªãã®ã§ãã
ã³ã³ãã¤ã«æDI + Play Module ãå©ç¨ããæ¹æ³
ããããæ¬é¡ã§ãã
ãã°ããæ©ãã ã®ã§ãããflyway-play 㨠scalikejdbc-play-support ã®åã¢ã¸ã¥ã¼ã«ã®ã³ã¼ããèªãã§ããã¨ãããã PlayModule
ã¨ããã¯ã©ã¹ãã PlayInitializer
ã¨ããåæåã¯ã©ã¹ãå¼ã³åºãã¦ãããã¨ããæ§é ã«ãªã£ã¦ãã¾ãã
ãããã® PlayModule
ã PlayInitializer
ã®ããã®ã¨ã³ããªãã¤ã³ããã¨ããã«ã³ã¸ã㤠PlayInitializer
ã®ã³ã³ã¹ãã©ã¯ã¿ããå¼ã³åºãã¦ãã¾ãã° Module ã®æ©è½ãå©ç¨ã§ãããã§ãã
ã¨ããããã§æ¬¡ã®ããã«ãªãã¾ãã
import play.api.ApplicationLoader.Context import play.api.BuiltInComponentsFromContext class MyComponents(context: Context) extends BuiltInComponentsFromContext(context) { ... new scalikejdbc.PlayInitializer(applicationLifecycle, configuration) new org.flywaydb.play.PlayInitializer(configuration, environment, webCommands) }
ä¸è¨ã¯ã³ã³ãã¤ã«æDIãæåã§ã´ãªã´ãªé å¼µã£ã¦ãã人åãã§ããmacwire ã使ã£ã¦ãããªã次ã®ããã«ããã°OKã§ãã
import com.softwaremill.macwire._ import play.api.ApplicationLoader.Context import play.api.BuiltInComponentsFromContext class MyComponents(context: Context) extends BuiltInComponentsFromContext(context) { ... wire[scalikejdbc.PlayInitializer] wire[org.flywaydb.play.PlayInitializer] }
macwire 便å©ã ããï¼
ã¾ã¨ã
- application.conf ã«
play.modules.enabled
ãè¨è¿°ãã¦ã¢ã¸ã¥ã¼ã«ãèªã¿è¾¼ã¾ããã®ã¯æ¨æºã®ApplicationLoader
ã使ã£ã¦ããå ´åã®ã¿ã - ã³ã³ãã¤ã«æDIã使ãå ´åã¯èªä½ã®
ApplicationLoader
ã®ä¸ã«èªåã§ãªãã¨ãããå¿ è¦ãããã - macwire 便å©ï¼å¤§äºãªãã¨ãªã®ã§ï¼ã