如何在Scala中创建一个功能良好的可配置对象?我已经观看了Tony Morris关于Reader
单子的视频,但我仍然无法理解。
我有一个硬编码的Client
对象列表:
class Client(name : String, age : Int){ /* etc */}
object Client{
//Horrible!
val clients = List(Client("Bob", 20), Client("Cindy", 30))
}
我希望能在运行时确定Client.clients
,并且可以根据需要从属性文件或数据库中读取。在Java世界中,我会定义一个接口,实现两种数据源,并使用依赖注入来分配类变量:
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确实很突兀(另一方面,对我来说它似乎真的不麻烦,因为我知道它只会被注入一次)。
在这种情况下,Reader
monad看起来像什么?请像我5岁那样向我解释一下,它有什么优点?
val
可以使用反射进行修改,因此您的依赖注入库可能会“注入一个val”。 - gerferraval
与var
的所有正常优点都适用,至少如果我不在那个val
上自己使用反射的话... - gerferra