scala/typesafe配置是否提供了一些方法来配置trait的可插拔实现?
我面临以下任务,即提供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 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