ファサード層を介してnhibernate linqフェッチ戦略を設定する方法
-
27-09-2019 - |
質問
私はデータアクセスのためにnhibernateを使用していますが、ファサード層からアクセスしています。このレイヤーは、リポジトリのインターフェイスに加えて、ISESSIONオブジェクトに対応するIUNITOFWORKインターフェイスで構成されています。
取得されたエンティティが正しく管理されるために、リポジトリはコンストラクターのiUnitofworkに渡され、iunitofworkが荷重に使用されます。
iUnitofworkには、Allと呼ばれるプロパティが含まれており、クラスのすべてのエンティティをiQueryable(後のフィルタリング用)として取得します。したがって、今年作成されたすべてのエンティティを取得するリポジトリ方法は、次のようになるかもしれません。
NB: :これは、これらのインターフェイスとクラスの完全なコードではありません!私の質問に関連するコードのみ。
iunitofworkインターフェイス:
IQueryable<T> GetList<T>();
UnitofWorkコンクリートクラス:
public IQueryable<T> GetList<T>()
{
return _session.Linq<T>();
}
iFOorepositoryインターフェイス
IQueryable<Foo> All { get; }
IEnumerable<Foo> ThisYearsFoos{ get; }
Foorpositoryコンクリートクラス
public IQueryable<Foo> All
{
get { return _unitOfWork.GetList<Foo>(); }
}
public IEnumerable<Foo> ThisYearsFoos
{
get { return All.Where(x => x.DateCreated > new DateTime(2010,1,1);}
}
関連するエンティティを熱心にロードできるように、フェッチ戦略を指定する機能を追加したいと思います。だから、Fooには別のエンティティ、Barに対応するプロパティがあるとしましょう。
public class Foo
{
public Bar {get;set;}
}
マッピングファイルは、バーが怠zy-ロードされていることを指定していますが、私のthiseyearsfoosリポジトリプロパティでは、n+1の選択を避けるために、バーを熱心にロードする必要があることを指定したいと思います。
linqからnhibernateでは、expand()拡張法を使用して熱心なフェッチを指定できます。ただし、この拡張メソッドはnhibernatequeryableタイプに属しますが、iUnitofworkインターフェイスのGetSlistメソッドはiQueryableについてのみ知っています。
明らかに、IunitofworkインターフェイスがNhibernateを知らないはずだったので、Inhibernatequeryableについて知りたくないのです。
上記で指定したデザインを使用して、考えられなかったこれを行う方法はありますか?それとも私のデザインは再考を必要としていますか?
ありがとう
デビッド
解決
Nhibernate 3.xにアップグレードします。拡張に対応する新しい方法(Fetch
)iQueryableで動作します。
他のヒント
あなたはいくつかの矛盾することを言っています: - あなたはインターフェースを公開したくない - あなたはそのインターフェースの使用を使用したい
それは不可能です。デザインを再考する必要があります。ほとんどの人とは異なることに対して、作業の用語単位を使用します。ほとんどの人は、作業インターフェイスの単位がメソッドをコミットしてロールバックすることを期待していますが、iQueryableではありません。