Как мне создать правильно функционирующий настраиваемый объект в Scala? Я посмотрел видео Тони Морриса о монаде Reader
и до сих пор не могу соединить точки.
У меня есть жесткий -закодированный список из 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, мне это не кажется действительно хлопотным, так как я знаю, что будет вводиться один раз -и -только -один раз ).
Как бы выглядела в этой ситуации монада Reader
и, объясните мне, как будто мне 5, в чем ее преимущества?