如何通过façade层设置NHibernate Linq获取策略

时间:2010-08-11 13:47:19

标签: nhibernate linq-to-nhibernate fetching-strategy facade

我正在使用NHibernate进行数据访问,但是通过façade层访问它。该层包含存储库的接口,以及对应于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; }

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存储库属性中,我想指定应该急切加载Bar以避免N + 1选择。

在Linq to NHibernate中,我们可以使用Expand()扩展方法指定急切提取。但是,此扩展方法属于NHibernateQueryable类型,而IUnitOfWork接口的GetList方法只知道IQueryable。

显然,我不希望IUnitOfWork接口知道INHibernateQueryable,因为它应该不知道NHibernate。

使用我上面指定的设计,有没有办法做到这一点,我无法想到?或者我的设计是否需要重新考虑?

由于

大卫

2 个答案:

答案 0 :(得分:2)

升级到NHibernate 3.x.与Expand(Fetch)对应的新方法对IQueryable进行操作。

答案 1 :(得分:0)

你说的是一些相互矛盾的事情: - 您不希望公开界面 - 您想使用该接口

这是不可能的。你必须重新考虑你的设计。 您使用术语工作单元的方式与大多数人不同。 大多数人都希望工作单元接口具有Commit和RollBack方法,但不是一些IQueryable。