2011-07-13 6 views
3

私が抱えている問題は、Fluent NHibernateのようなものに移行するという考えで、既存のORM(これはGentleという古いものです)を使用してデータアクセスレイヤを構築することです。パラメータがあるということでこれはジェネリックスとC#の動的データ型の適切な使用ですか?

"PersonId in (SELECT PersonId from Orders where OrderValue > " + orderValue + " and OrderName = " + orderName 

ポイント:我々はいくつかの人のオブジェクトを取得する際、インスタンスのために、我々はLIKE句を追加するかもしれませんので、当社の既存のセットアップでSqlBuilderにカスタム句を追加する必要があり、いくつかのクエリがあります。パラメータ化されたクエリではなく文字列に直接追加されるため、Gentleではパラメータ化されたクエリとして追加することが可能です。これが私が取り組んできたものです。すべてのDALはベースGentleDALから継承しています。これは実際に穏やかなクエリを作成し、句とパラメータなどを追加するクラスです。Gentleでparameterised句を追加するには、SqlBuilderオブジェクトで2つのことを行う必要があります。sb.AddConstraint(string clause)あなたの句を追加してから、sb.AddParameter(string name, Type type)を呼び出す必要がある各パラメータについて、SqlStatementオブジェクトをこれから構築し、それ以降はstmt.SetParameter(string name, object value)を呼び出すパラメータの値を設定することができます。

これらのパラメータ/句を表現する方法は、GentleClauseCollectionというクラスを作成したことです。これには句とパラメータが含まれており、これらの両方のメソッドのAddメソッドとGetメソッドがあります。節は文字列でListの内部に格納され、パラメータはジェネリックを使用するGentleParameterクラスに格納されます。 GentleParameterの完全なコードは次のとおりです。

public class GentleParameter<TParamType> 
{  
    public string Name { get; private set; } 
    public TParamType Value { get; private set; } 
    public Type ParameterType {get { return typeof (TParamType); }} 
    public GentleParameter(string parameterName, TParamType parameterValue) 
    { 
     Name = parameterName; 
     Value = parameterValue; 
    } 
} 

私は私が同じコレクション内TParamTypeの異なる値に対してGentleParameterを保存しましょうということを知ってる.NETには、コレクションは、しかし、それはDLRを使用して行うことができ、ありません。私のGentleCollectionクラスでは、Listにパラメータを格納し、このクラスのパラメータをIEnumerableとして取得します。私のクラスのAddメソッドは、GentleParameterの追加だけを許可することができるので、私のパラメータには常にアクセスできるName、Value、ParameterTypeフィールドがあることがわかっています。

私はジェネリックスを犠牲にして、パラメータクラスのValueプロパティをTではなく 'オブジェクト'に変更することができたので、ダイナミックを使って過度に複雑にしましたか、両方のアプローチの長所と短所は何ですか?動的オブジェクトを使用するすべてのメソッド呼び出しが実行時にコンパイルされるため、私は思っていないし、パフォーマンスに与える影響が、動的を使用することによってどのくらい重大な影響を及ぼすのかという3つ目の方法がありますか?

ご協力いただきありがとうございます。

答えて

2

sb.SetParameterは一般的ではなく、objectを待っているので、GentleParameterは一般的ではないため、私はDLRを使用しません。

+0

ありがとう、私はコンセンサスであると思った。 –

1

ダイナミックを使用することは私には複雑すぎるようではありません。メソッドの呼び出しは実行時に解決され、キャッシュされるため、呼び出しの平均はおそらく平均で約10倍遅くなります(これはナノ秒です)。したがって、それが意味をなさなく使用する方法に依存します。

いつもタイプObjectとして使用する場合は、ダイナミックタイプを使用する必要はありません。何も傷つけることはありません。

プロパティにアクセスできるようにするには、動的にする必要があります。結果コードは、実行可能なものよりもきれいに見えます。

ダイナミックでも、必ずしも動的にプロパティを呼び出す必要はありません。静的な型指定が必要な場合は、GentleParameterのジェネリックフォームを使用してヘルパーメソッドを動的に解決することができます。その中のあなたの仕事。

... 

private void HelperDoStuffWithGenericParam<T>(GentleParameter<T>param){ 

     //Do stuff you have the static typing 
} 
+0

+1静的に型指定されたヘルパーメソッドの提案は興味深いようです。私のコードがどのように見えるかを見てください。私はそれが実際にはきちんとした解決策になると思う。 –

+0

私は私のようなものがあると私の状況でこれがどのように機能するのかはっきりしていません。 IEnumerable パラメータ。 foreach(パラメータのvarパラメータ) { stmt.SetParameter(parameter.Name、parameter.Value); } ランタイムまでTがわからないので、パラメータオブジェクトをGentleParameter にキャストする方法がわかりません。 –

+0

をループ呼び出しHelperSetStatementParam(stmt、parameter) - void HelperSetStatementParam (SqlStatement stmt、GentleParameter パラメータ){stmt.SetParameter(parameter.Name、parameter.Value); }ヘルパーへの呼び出しは実行時に解決されます。 – jbtule

関連する問題