4

これはオブジェクト指向デザインです。Q。アプリでtypesafeConfigを使用しています。Configインターフェースは非常に便利ですが、私のアプリケーションにはいくつかのフィールドがあります。必須の設定ファイル。私がやりたかったのは、ConfigのsubInterfaceを作成し、これら2つのトップレベルメソッドを追加することでした。このようなもの

trait AppConfig extends Config{
    def param1:String 
    def param2:String 
}

ただし、Configのインスタンスを指定してAppConfigの実際のインスタンスを作成することは、実現可能ではないようです(ラッパーオブジェクトを作成して、Configインターフェイスのすべてのメソッドを複製したくありません)。理想的には、私はこれに近い何かを達成する何かを探しています

val conf:Config = //get config object from somewhere
return conf with AppConfig { overrider def param1 = {"blah"} }

最後の行が無効であることは理解しています。しかし、私は同等の機能を備えたパターン/構成を探しています。

4

3 に答える 3

2

私たちはこのようなことのためにConfigrityを使用してきました。次に例を示します。

オブジェクトの単体テストなどに使用するコンパイル済みのデフォルトを保持します

object DefaultConfigs {
  val defaultConfig = Configuration(
    "param1" -> "blah"
  )

  val otherConfig = Configuration(
    "param2" -> "blah"
  )

  val appConfig = defaultConfig.include(otherConfig)
}

そして、実行時にそれらを含めるかどうかを指定できます

val appConfig = Configuration.load(pathToConfig) include DefaultConfigs.appConfig
于 2012-09-06T22:16:51.003 に答える
1

ダイナミックとリフレクションを組み合わせて使ってみませんか。便利なメソッドを処理するための動的と、構成上のメソッドを処理するためのリフレクション。

これが刺し傷です:

class ConfigDynamic(val config: Config) extends Dynamic {
  def selectDynamic(name: String)= {
    name match {
      case "field1" => 
        config.getString("field1")
      case x @ _ =>
        // overly simplified here
        val meth = configClass.getDeclaredMethod(x)
        meth.invoke(config)
    }
  }
}
于 2012-09-06T23:03:49.483 に答える
1

あなたが探しているのは、基本的に「ダイナミックミックスイン」と呼ばれるものです。これは、すぐに使用できるscalaではサポートされていません。誰かがこれをサポートするコンパイラプラグインを開発しました:http ://www.artima.com/weblogs/viewpost.jsp?thread = 275588

ただし、少し古く、プロジェクトはもうアクティブではないようです。

より良い代替策は、scalaマクロを使用してこの機能を実装することです(scala 2.10が必要ですが、まだ安定したリリースはありません)。

しかし、あなたの場合、これはおそらくやり過ぎです。十分にテストされたライブラリが利用可能になるまで、プロキシを手動で作成することをお勧めします(ただし、見た目は鈍いです)。

trait ConfigProxy extends Config {
  def impl: Config
  // Forward to the inner config
  def root: ConfigObject = impl.root
  def origin: ConfigOrigin = impl.origin
  //... and so on
}

val conf:Config = //get config object from somewhere
val myConf: AppConfig = new AppConfig with ConfigProxy { 
  val impl = conf
  val param1:String = "foo"
  val param2:String = "bar"
}
于 2012-09-07T09:07:21.280 に答える