私はNHibernateをかなり新しくしていますが、私が見てきたほとんどの例では、基底であるCriterion
またはDetachedCriterion
クラスに抽象レイヤーを追加しています。どこかのサービスまたはリポジトリ層でそのクエリの抽象化は、その後、取得するためにNHibernateはで使用され、適切Criterion
オブジェクトに変換されNHibernateの基準を抽象化する価値はありますか?
public class Query<T>
{
public List<QueryCondition> Conditions { get; set;}
}
public class QueryCondition
{
public string Property { get; set; }
public ComparisonEnum Comparison { get; set; }
public object Value { get; set; }
}
:簡単な例では、それは次のようになりますQuery
クラスのいくつかの並べ替えです記録。
この例は、大過剰単純化です。私のプロジェクトでは、AND
とOR
の条件を含むQuery<T>
クラスを作成し、カスタム条件を変換するメソッドを定義しました(この場合は、上記の単純なQueryCondition
の例よりはるかに複雑です) AbstractCriterion
に追加してサービスに組み込まれたDetachedCriterion
に追加します。私がこれをした理由の1つは、ユーザがリストを定義して保存できるようにクエリを関連付けることですが、もっとも大きな理由は、これまで見たn層NHibernateプロジェクトのための一般的な方法であるようです。
しかし、私はこの抽象化のオーバーヘッドがそれに値するかどうか疑問に思っています。それは私にNHibernateの依存関係を保存しません。クエリをバッチ処理するために先物を使用しているので、私のプロジェクトはすべてレコード数のために少なくともIFutureValue
にアクセスするためにNHibernateを参照する必要があります。その上、私のQuery<T>
クラスは、それがAbstractCriterion
を構築するので、NHibernateと密接に結びついています(ただし、別のクラスに簡単に取り込めます)。
私がそれをもっと見ると、Query<T>
をDetachedCriteria
に置き換えることができます。どちらもシリアライズ可能なので、私はそれらを保持することができます。基準条件とは別の条件条件を作成しないので、複雑なクエリのエイリアス問題に遭遇する可能性は低くなります。そして抽象化が進む限り、これは複雑さから多くの断熱を提供するようには思われません。
NHibernate基準以外の理由を私に教えてもらえますか?「あなたはあなたのORMをいつか変更するかもしれません」(プロジェクトのこの段階では不可能だと思いますか?
を使用しています。この理由の
ポイントは意味をなさない。また、私のサービス層は、主にユーザのセキュリティ権限に基づいてデータをフィルタリングするセキュリティサービスであり、 'Query'を 'Criterion'に変換するという問題を強調しています。つまり、これらのサービスメソッド(主に並列リポジトリメソッド)のユニットテストも難しいでしょう。 'query.Conditions.Contains(requiredCondition);の代わりに –
;なぜ各メモリケースのデータでメモリ内のデータベースにデータを取り込み、その上でクエリを実行してください。翻訳のための追加のレイヤーは必要なく、正しい結果につながると思われる条件の代わりに実際のクエリを実際にテストするという追加の利点があります。 – Firo