0

データベースに構成を保存および更新する必要がある 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);
}

これに関する問題は、このコードをあちこちで繰り返さなければならないことです。

シングルトン、静的クラス、プロキシ、またはファクトリ メソッドを含むより良いソリューションがあると感じていますが、これらの概念にはまだ慣れていません。

4

2 に答える 2

1

ドメイン オブジェクトで ORM を参照しないでください。代わりに、ORM またはその他のデータ アクセス手法のいずれかを利用するリポジトリに実装します (たとえば、ほとんどの orms はキーと値のペアと厳密に型指定されたオブジェクトとの間をマッピングできないため、データ リーダー) )。

また、エンティティ (globalsettings) にコンストラクターでキーと値のペアを与えることはお勧めしません。ドメインとは関係がないため、キーと値のペアをドメイン オブジェクトにマップし、代わりにリポジトリまたは dal であるマッパー レイヤーにマッピングを実装します。

例えば:

アプリケーション層で

public GlobalSettings GetUserSettings(User user)
{
  return _globalSettingsRepository.GetGlobalSettings(user);
}

リポジトリ層で

public GlobalSettings GetGlobalSettings(User user)
{
  var keyvalue = _context.blablabla();
  var globalSettings = new GlobalSettings { Id = keyvalue["key"], DateCreated = DateTime.Parse(keyvalue["datecreated"]) };
  return globalSettings
}
于 2011-10-04T16:11:15.207 に答える
0

Key-ValueペアにマップするORMは存在しないと思います。実際、このデータにはDataReaderを使用する方がおそらく効率的です。ただし、データを取得する場合は、構成KVPを使用して辞書を作成し、プロパティパターンを使用してアクセスできます。次に、必要になることがわかっているプロパティに対して、強く型付けされたアクセサーを作成できます。これにより、コードを変更せずにプロパティを追加する柔軟性を維持しながら、知っているプロパティに強く型付けされたオブジェクトを使用できるようになります。

于 2011-10-04T15:41:58.437 に答える