Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala/typesafe配置是否提供了一些方法来配置trait的可插拔实现?_Scala_Typesafe Config - Fatal编程技术网

scala/typesafe配置是否提供了一些方法来配置trait的可插拔实现?

scala/typesafe配置是否提供了一些方法来配置trait的可插拔实现?,scala,typesafe-config,Scala,Typesafe Config,我面临以下任务,即提供trait的实现作为一个配置选项。 我有以下类层次结构: trait Storage { def store() } object LocalStorage extends Storage { def store(){ ... } } object RemoteStorage extends Storage { def store(){ ... } } 在属性文件中具有配置: storage.class = "com.xxx.LocalStorage"

我面临以下任务,即提供trait的实现作为一个配置选项。 我有以下类层次结构:

trait Storage {
  def store()
}

object LocalStorage extends Storage {
   def store(){ ... }
}

object RemoteStorage extends Storage {
   def store(){ ... }
}
在属性文件中具有配置:

storage.class = "com.xxx.LocalStorage"
在持久性层上有一个实现:

class CheckPersister{
val storageType = ConfigFactory.load().getString("storage.class")
val storage: Storage = Class.forName(storageType).asInstanceOf[Storage]
...
}
有没有更好的方法来处理这种配置?我正在使用类型安全配置


Thx

在配置文件中直接指定类的名称看起来不是个好主意。这样的事情可以接受吗

storage.location = "local"

class CheckPersister {
  val storageType = ConfigFactory.load().getString("storage.class")
  val storage: Storage = storageType match {
    case "local" => LocalStorage
    case "remote" => RemoteStorage
    case x => throw new RuntimeException(s"Invalid storage type $x specified")
  }
  ...
}

这样你就不会意外地实例化一个你不想要的类。

据我所知不是这样。你可以自己设置
Config
来提供类似
getClassType[T](propName:String):Class[T]
getInstance[T](propName:String):T
的东西,如果你发现这对你的系统来说是常见的,那么你很少需要一个完全无限的类型列表来实例化什么。更现实地说,你有一些选择,这很好地说明了这一点。如果你添加了一个新的类型,我不得不想象它是在一个发布周期内,所以你只需在这个匹配语句中添加对它的支持,然后就可以了。我也在考虑这个问题,但只是想知道是否有更好的替代方案,我不知道。例如,对于Akka,我为[Actor](loggerName)找到了system.dynamicAccess.getClassFor