2

データ アクセスに NHibernate を使用していますが、ファサード レイヤーを介してアクセスしています。このレイヤーは、リポジトリのインターフェイスと、ISession オブジェクトに対応する IUnitOfWork インターフェイスで構成されます。

取得されたエンティティが正しく管理されるように、リポジトリにはコンストラクタで IUnitOfWork が渡され、ロードには IUnitOfWork が使用されます。

IUnitOfWork には All というプロパティが含まれており、クラスのすべてのエンティティを IQueryable として取得します (後でフィルタリングするため)。したがって、今年作成されたすべてのエンティティを取得するリポジトリ メソッドは、次のようになります。

注意: これは、これらのインターフェイスとクラスの完全なコードではありません! 私の質問に関連するコードのみ。

IUnitOfWork インターフェイス:

IQueryable<T> GetList<T>();

UnitOfWork 具象クラス:

public IQueryable<T> GetList<T>()
{
  return _session.Linq<T>();
}

IFooRepository インターフェイス

IQueryable<Foo> All { get; }
IEnumerable<Foo> ThisYearsFoos{ get; }

FooRepository 具象クラス

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;}
}

マッピング ファイルでは Bar が遅延読み込みされるように指定されていますが、ThisYearsFoos リポジトリ プロパティで、N+1 選択を回避するために Bar を積極的に読み込むように指定したいと思います。

Linq to NHibernate では、Expand() 拡張メソッドを使用して熱心なフェッチを指定できます。ただし、この拡張メソッドは NHibernateQueryable 型に属していますが、IUnitOfWork インターフェイスの GetList メソッドは IQueryable についてしか認識していません。

明らかに、IUnitOfWork インターフェイスが INHibernateQueryable について認識したくないのは、それが NHibernate について認識していないことが想定されているためです。

上記で指定したデザインを使用して、これを行う方法はありますか? それとも、私のデザインを再考する必要がありますか?

ありがとう

デビッド

4

2 に答える 2

2

NHibernate 3.x にアップグレードします。Expand( Fetch) に対応する新しいメソッドは、IQueryable で動作します。

于 2010-08-11T16:05:41.937 に答える
0

あなたはいくつかの矛盾することを言っています:-あなたはインターフェースを公開したくない-あなたはそのインターフェースを使用したい

それは不可能です。あなたはあなたのデザインを再考しなければなりません。作業単位という用語は、ほとんどの人とは異なる目的で使用します。ほとんどの人は、作業単位のインターフェースにCommitメソッドとRollBackメソッドがあることを期待しますが、一部のIQueryableはありません。

于 2010-08-11T14:50:05.040 に答える