我正在使用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。
使用我上面指定的设计,有没有办法做到这一点,我无法想到?或者我的设计是否需要重新考虑?
由于
大卫
答案 0 :(得分:2)
升级到NHibernate 3.x.与Expand(Fetch
)对应的新方法对IQueryable进行操作。
答案 1 :(得分:0)
你说的是一些相互矛盾的事情: - 您不希望公开界面 - 您想使用该接口
这是不可能的。你必须重新考虑你的设计。 您使用术语工作单元的方式与大多数人不同。 大多数人都希望工作单元接口具有Commit和RollBack方法,但不是一些IQueryable。