Мне бы тоже хотелось узнать официальный ответ, но никто не ответил, поэтому я решил побродить.Извините, если этот ответ не является исчерпывающим.
Лучший пример, который я нашел, был в com.twitter.ostrich.admin.RuntimeEnvironment
, особенно если вы смотрите в основном на loadConfig
.
СкажитеВы хотите настроить экземпляр класса T
.Основная идея заключается в следующем:
- Получите
java.io.File
, который содержит исходный код Scala, который оценивается как com.twitter.util.Config[T]
. - Чтобы быть действительным
Config[T]
, вам нужно иметь def apply(): T
метод.Чтобы сохранить детали реализации вне конфигурационного файла, вам нужно определить класс в вашем проекте, который расширяет Config[T]
.Вы также можете использовать этот класс для определения полей по умолчанию / обязательных для заполнения. - Создание нового экземпляра
com.twitter.util.Eval
и вызов apply(file)
для получения экземпляра Config[T]
. - Позвоните
config.validate()
, чтобы выдать правильные исключения для искаженных файлов конфигурации. - Позвоните
config.apply()
, чтобы получить полностью настроенный экземпляр T
.
Вот простойНапример, где я настраиваю новый WidgetService
:
class WidgetService(val port: Int)
class WidgetConfig extends com.twitter.util.Config[WidgetService] {
var port = required[Int]
def apply(): WidgetService = {
new WidgetService(port)
}
}
object MyApp extends App {
val configFile = new java.io.File("mywidget_config.scala")
val eval = new com.twitter.util.Eval
val config = eval[com.twitter.util.Config[WidgetService]](configFile)
config.validate()
val widgetService = config()
println(widgetService.port)
}
А вот mywidget_config.scala
:
new WidgetConfig {
port = 8000
}
Примечание: возможно, вам придется внести изменения, если вы поместите это впакет.Я сделал все в пакете по умолчанию для краткости.
Чтобы заставить работать зависимости, я добавил это в свою конфигурацию SBT:
libraryDependencies += "com.twitter" % "util" % "1.10.1"