4

うまくいけば、Dapperを使用して、ビジネスモデルにオブジェクトリレーションマッピングを提供するようになります。

これらのデータモデルに加えて、ユーザーによって作成され、返された結果セットの一部として表示されるカスタムフィールド(実行時には不明)に遭遇することがよくあります。

Id
Title
c_MyCustomField1
c_MyCustomField2

現在、これらのフィールドはすべて返され、リーダーで処理されます。私たちはこれをすべてDapperに移すのが好きですが、動的カスタムフィールドと混合された強く型付けされたオブジェクトを混合する方法を見つけるのに苦労しています。

次のようなオプションが表示されます。

  1. dapperからすべての結果を動的として取得し、独自のバインディングを実行します。
  2. Dapperに強い型のモデルにバインドさせ、別の呼び出しを行ってカスタムフィールドをアタッチします。
  3. Dapperを拡張して真ん中に入るには、既知のフィールドと動的フィールドの両方をバインドする特定のユーザーケースを追加します。

1は逆効果のようで、パフォーマンスに影響を与える可能性があります。そのため、最初にDapperを紹介します。 2これにはデータプロバイダーの大幅な変更が必要になるため、実際には実行できません。 3私はDapperのソースに属していないことを知っています。

聖杯は次のようなモデルになってしまうと思います。

class Model
{
    int Id {get; set;}
    string Title {get; set;}
    IList<CustomField> CustomFields {get; set;}
}

class CustomField : dynamic
{
    string Name {get; set;}
    object Value {get; set;}
}

Dapperを使用してこれを行う方法はありますか?

いつものように、どんな提案も大歓迎です。

4

1 に答える 1

3

現在、dapperではそれをきれいにモデル化することはできません。非汎用APIを使用して何かを実行し、バインディングを手動で適用できる場合があります。または、ダイナミックをラップするだけかもしれません。

class Model {
    private dynamic obj;
    public int Id { get { return obj.Id; } set { obj.Id = value; } }
    public string Title { get { return obj.Title; } set { obj.Title = value; } }

    public object this[string key] {
        get { return ((IDictionary<string,object>)obj)[key]; }
        set { ((IDictionary<string,object>)obj)[key] = value; }
    }
}

ジェネリックパラメータを指定せずにを使用してdynamic/を取得できます。IDictionary<string,object>Query

于 2013-02-12T09:33:23.733 に答える