All Downloads are FREE. Search and download functionalities are using the official Maven repository.

skinny.injection.SkinnyScaldi.scala Maven / Gradle / Ivy

There is a newer version: 3.0.0-RC1
Show newest version
package skinny.injection

import scaldi.{ Injector, MutableInjectorAggregation, Module }
import skinny.{ SkinnyConfig, SkinnyEnv }
import scala.collection.concurrent.TrieMap
import scala.util.control.NonFatal

/**
 * The singleton holder of Scaldi components for SkinnyEnv.
 */
object SkinnyScaldi extends SkinnyScaldi {

  private[this] val scaldiInjectors: TrieMap[String, MutableInjectorAggregation] = TrieMap()

  /**
   * Finds modules for this SkinnyEnv.
   */
  def modulesForEnv(env: String = SkinnyEnv.getOrElse(SkinnyEnv.Development), defaultModules: Seq[Module] = Nil): MutableInjectorAggregation = {
    scaldiInjectors.getOrElseUpdate(env, {
      new MutableInjectorAggregation(
        defaultModules.toList ::: SkinnyConfig.stringSeqConfigValue("scaldi.modules").map { moduleClasses: Seq[String] =>
          moduleClasses.map { moduleClass: String =>
            try {
              val clazz: Class[_] = Class.forName(moduleClass)
              clazz.newInstance().asInstanceOf[Module]
            } catch {
              case NonFatal(e) =>
                throw new ScaldiConfigException(
                  s"Failed to load a Scaldi module because of ${e.getClass.getCanonicalName} (${e.getMessage})", e
                )
            }
          }.toList
        }.getOrElse(Nil)
      )
    })
  }

}

/**
 * Scaldi support.
 */
trait SkinnyScaldi {

  /**
   * Module for framework components.
   */
  def skinnyModule: Module = new SkinnyModule

  def injectorForEnv(env: String = SkinnyEnv.getOrElse(SkinnyEnv.Development)): Injector = {
    SkinnyScaldi.modulesForEnv(env, Seq(skinnyModule))
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy