Dapperを使用して、追加の動的プロパティを持つ強く型付けされたモデルにバインドする

c# dapper dynamic strong-typing

質問

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を使ってこれを行う方法はありますか?

いつものように、どんな提案も大いに感謝しています。

受け入れられた回答

それは現在の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; }
    }
}

genericパラメータを指定せずにQueryを使用することで、 dynamic / IDictionary<string,object>を取得できます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ