Scalaで正しく機能する設定可能なオブジェクトを作成するにはどうすればよいですか?私はReader
モナドのTony Morrisのビデオを見てきましたが、私はまだドットを接続することができません。Scalaの構成データ - Readerモナドを使用する必要がありますか?
私はClient
オブジェクトのハードコーディングされたリストを持っている:私はClient.clients
プロパティからそれを読んですると、データベースからファイルまたはいずれかの柔軟性と、実行時に決定することにしたい
class Client(name : String, age : Int){ /* etc */}
object Client{
//Horrible!
val clients = List(Client("Bob", 20), Client("Cindy", 30))
}
を。 Javaの世界では、私は、インターフェイスを定義するソースの2種類を実装し、クラス変数を割り当てるために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
私はそれが once-and-only-onceの)注入されます知っているので、は、OTOH、それは私に本当に面倒なようではありません(飛び出しありません。
この状況では、Reader
モナドはどのように見えますか?私が5のように私に説明すると、その利点は何ですか?
'val's *は反射を使って変更することができるので、あなたの依存性注入ライブラリは" valを注入 "する可能性があります – gerferra
@gerferra varがある場合、リフレクションによって修正されたvalのポイントは何ですか? –
なぜ 'Client'を引数を持つクラスにしないと、configは' Client'のインスタンスに渡すことができますか? –