如何在 Scala 中创建功能正确的可配置对象?我在Reader
monad 上看过 Tony Morris 的视频,但我仍然无法连接这些点。
我有一个硬编码的Client
对象列表:
class Client(name : String, age : Int){ /* etc */}
object Client{
//Horrible!
val clients = List(Client("Bob", 20), Client("Cindy", 30))
}
我想Client.clients
在运行时确定,可以灵活地从属性文件或数据库中读取它。在 Java 世界中,我会定义一个接口,实现两种类型的源代码,并使用 DI 分配一个类变量:
trait ConfigSource {
def clients : List[Client]
}
object ConfigFileSource extends ConfigSource {
override def clients = buildClientsFromProperties(Properties("clients.properties"))
//...etc, read properties files
}
object DatabaseSource extends ConfigSource { /* etc */ }
object Client {
@Resource("configuration_source")
private var config : ConfigSource = _ //Inject it at runtime
val clients = config.clients
}
这对我来说似乎是一个非常干净的解决方案(代码不多,意图明确),但这var
确实跳出来了(OTOH,在我看来这并不麻烦,因为我知道它只会被注入一次-一次)。
在这种情况下,monad会是什么样Reader
子,像我 5 岁一样向我解释,它有什么优势?