【问题标题】:How to set NHibernate Linq fetch strategy through a façade layer如何通过外观层设置 NHibernate Linq 获取策略
【发布时间】:2011-03-28 09:38:14
【问题描述】:

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

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

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

使用我上面指定的设计,有没有我想不到的方法?还是我的设计需要重新考虑?

谢谢

大卫

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 现在就是答案! NHibernate 3 处于什么状态?
    【解决方案2】:

    您在说一些相互矛盾的事情: - 你不想暴露接口 - 你想使用那个界面

    那是不可能的。你必须重新考虑你的设计。 您使用工作单元一词来表示与大多数人不同的事情。 大多数人希望工作单元接口具有 Commit 和 RollBack 方法,但不是某些 IQueryable。

    【讨论】:

    • 我还没有指定这些类和接口的完整代码!只有与我的问题相关的位!
    • 这对工作单元很有意义。我仍然认为你必须重新考虑你的设计,因为你想要冲突的东西。
    • 我不认为我在尝试做有冲突的事情。你能告诉我你的意思吗?
    • 您说您想在一个类之外使用某些功能,并且您不想在该类之外公开该功能。我不知道如何更好地解释它。 Diego 的建议可能会如你所愿。
    • 我想在某种意义上你所说的是我问题的核心。我只想公开一个 IQueryable(因为它不是特定于 NHibernate),但我想要的功能不能通过 IQueryable 获得——除了 NHibernate 3,正如 Diego 所说。但我也很感兴趣这个问题是否源于糟糕的设计。 (我怀疑它可能。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2013-01-29
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多