Dapperを使用してASP.NET SQLメンバシッププロバイダテーブルとのインターフェイスを作成しようとしています。私はSqlMembershipProviderクラスをラップし、私が持っているカスタムテーブルに関連する特定の基準が与えられたMembershipUsersを得るための追加のメソッドを追加しました。Dapperでカスタムコンストラクタを呼び出しますか?
Dapperを使用してデータをクエリすると、Dapperはまずパラメータなしのコンストラクタを使用してクラスをインスタンス化し、返された列をオブジェクトのプロパティに「マップする」ように見えます。
ただし、MembershipUserクラスのUserNameプロパティにはセッターがありません。 Dapper SqlMapper.csの行1417から判断すると、GetSettableProps()
メソッドは設定可能なプロパティのみを取得します。
コンストラクタを呼び出すためにMultiMapクエリを実行しようとしましたが、クエリに渡されたオブジェクトにUserNameが既に不足しているという問題があります。
私はGetSettableProps()
メソッドを変更できると推測していますが、それがうまくいくかどうか、または既存のコードに影響するかどうかはわかりません。
私は、MembershipUserクラスにあるカスタムコンストラクタを呼び出すことはできますか?
また、状況をサポートするためにDapperに合理的な変更を加えることはできますか?
** UPDATE **
非ジェネリック/ダイナミッククエリ()メソッドを使用するには、マルクの答えは正解だったが、後世のために、これは私が内部Dapperのに言及していた方法は次のとおりです。
static List<PropInfo> GetSettableProps(Type t)
{
return t
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Select(p => new PropInfo
{
Name = p.Name,
Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true),
Type = p.PropertyType
})
.Where(info => info.Setter != null)
.ToList();
}
..? – MethodMan
正直言って、私はちょうどここで中間のタイプを使用しています - または非ジェネリッククエリAPI( "ダイナミック"経由)...私はprotobufネットから持ち上げることができるいくつかのコードを持っていますが、本当にそれが有益だろうと確信していません... –