データベースに構成を保存および更新する必要がある Web アプリに取り組んでいます。たとえば、デフォルトの色、言語、優先する日付形式などのユーザー設定を保存する場合があります。
データベース テーブルは、名前と値のペア (nvarchars) で構成されます。十分に単純です。
ORM を使用して、これらの名前と値の文字列のペアのリスト (実際には IEnumerable) を取得しています。私の問題は、これらの IEnumerable を名前/値の文字列よりも表現力のあるものに変える必要があることです。つまり、厳密に型指定された構成オブジェクトを作成したいと考えています。
理想的には、この構成オブジェクトが ORM に直接依存しないようにしたいのですが、このオブジェクトの初期化とユーザー設定の永続化のため、どうすればよいかわかりません。 ORM を通過する必要があります。
救助のためのある種のデザインパターン?
(関係ありませんが、私は C# と Entity Framework を使用しています。)
編集:
ドメイン オブジェクトに次のフィールドがあるとします。
public class SettingNameValuePair {
public string Name {get;set;}
public string Value {get;set;}
}
public class GlobalSettings {
public System.Drawing.Color FontColor {get;set;}
public TimeZoneInfo DefaultTimeZone {get;set;}
public DateTime DateCreated {get;set;}
... constructor ...
... validation, other functions ...
}
ORM をセットアップして、SettingNameValuePair を取得して永続化することは、あまり手間をかけずに行うことができます。ただし、GlobalSettings を取得して永続化するにはどうすればよいですか? つまり、アプリケーションのどこかで、グローバル設定のインスタンスを取得したいと考えています。
using (var context = new ApplicationContext()) {
GlobalSettings settings = ???
}
もちろん、ORM は、SettingNameValuePair と GlobalSettings の間でどのように自動的に変換されるかを知りません。GlobalSettings の厳密に型指定されたプロパティを生成するには、「配管」コードを記述する必要があることはわかっています。
私の質問は次のとおりです。SettingNameValuePair によって設定された GlobalSettings のインスタンスを取得する良い方法は何ですか? 以下の 2 つのオプションは、間違いなく間違っています。
1) GlobalSettings のコンストラクターにデータ コンテキストを引数として持たせます。これにより、不適切な依存関係が発生し、テストが困難になります。
2) GlobalSettings のコンストラクターに、次のようにデータ コンテキストから SettingNameValuePair を取得させます。
using (var context = new ApplicationContext()) {
IEnumerable<SettingNameValuePair> nameValuePairs =
context.NameValuePairs.ToList();
GlobalSettings settings = new GlobalSettings(nameValuePairs);
}
これに関する問題は、このコードをあちこちで繰り返さなければならないことです。
シングルトン、静的クラス、プロキシ、またはファクトリ メソッドを含むより良いソリューションがあると感じていますが、これらの概念にはまだ慣れていません。