2011-02-03 14 views
1

私はいくつかの場所に展開されているシステムを作成しており、各サイトには独自の設定と設定が必要です。 「構成」は、特定のサイト(データベースURL、S3バケット名など)に必要な名前付きの値です。すべての設定が必要ですが、通常はデフォルトではなく、通常は文字列値です。設定は名前付きの値ですが、システムの動作を調整するだけです。それはしばしば数値またはブール値であり、通常はデフォルト値があります。設定と設定を実装するにはどうすればよいですか?

これまでは、プロパティファイルやそのようなものを使用してきましたが、それはひどい解決策です。開発者は構成の要件を追加しましたが、ライブ構成のファイルに値を追加していないため、新しいリリースはすべてのテストに合格し、公開すると失敗しました。

もちろん、すべてのファイルがコンパイルされるため、欠落している設定や間違ったタイプのものがあれば、コンパイラーを通過することはありません。サイト固有のクラスをビルドに挿入します各サイト。骨組みとして、Scalaファイルは複雑な値、特にリストだけでなく、マップやタプルも簡単にモデル化できます。

不利な点は、開発者ではないユーザーがファイルを管理することがあるため、プロパティファイルの利点であることがわかります。 (誰かが私にXML設定を説明します:コンパイル可能なファイルのすべての複雑さですが、プロパティファイルの実行時のリスクです)

私が探しているのは、グループの必要な名前と許容値を定義するための簡単なパターンです。助言がありますか?

+0

私はあなたのq欲求はスカラー特有です。私は重要な点を見逃していますか? – Nicolas

+0

設定ファイル*をScala *に書きたいと思います。 – Malvolio

+0

あなたはあなたのクエストの一部を忘れてしまったと思います。 – Nicolas

答えて

0

Liftは本質的にWebフレームワークですが、いくつかのユーティリティもあります。それらの1つは依存性注入です。http://simply.liftweb.net/index-8.2.html#toc-Section-8.2を参照してください。したがって、たとえば、デフォルト値を持つベースtraitを作成し、Runtime、Development、Test ...の環境値をサブクラス化することができます。スカラーの知識がない人にとっては、override def defaultValue = "new value"をファイルに入れるのは簡単だと思います。

1

Mixin組成の使用はどうですか?特徴は、右から左に適用されているので、私たちはすることができます:

は特性を定義します。

デフォルトプロパティ:

trait PropertyA { 
    val userName = "default" 
    def useUserName() : Unit = { 
    println(userName) 
    } 
} 

他のいくつかのプロパティ:

trait SomePropertyA extends PropertyA { 
    val userName = "non-default" 
    def useUserName() : Unit = { 
    println(userName) 
    } 
} 

デフォルトプロパティを持つ抽象クラスを定義します。 :

trait HasPropertyA { 
    val prop : PropertyA = new PropertyA 
}

非抽象クラスの定義 - デフォルトプロパティ:

trait MyClass extends PropertyA { 
    doSomethingWith(prop.userName) 
}

またはいくつかの他の特性とそれを混ぜて、他の状況で:

if(env.isSome) { 
    val otherProps = MyClass with HasSomeOtherPropertyA 
    doSomethingWith(prop.userName)// userName == non-default! 
} 
あなたのクラスの使用デフォルトのものでは

trait HasSomeOtherPropertyA extends HasPropertyA { 
     override val prop:PropertyA = new SomePropertyA {} 
}

論文の詳細を読むScalable Component Abstractions

関連する問題