代码之家  ›  专栏  ›  技术社区  ›  David

如何通过立面层设置NHibernate LINQ获取策略

  •  2
  • David  · 技术社区  · 14 年前

    i_m使用nhibernate进行数据访问,但通过fa_ ade层进行访问。该层由存储库的接口以及与ISession对象对应的IUnitOfWork接口组成。

    为了正确管理检索到的实体,存储库在其构造函数中传递一个IUnitOfWork,并使用IUnitOfWork进行加载。

    IUnitOfWork包含一个名为All的属性,该属性以iQueryable的形式检索类的所有实体(用于以后的筛选)。因此,检索今年创建的所有实体的存储库方法可能如下所示:

    :这不是这些接口和类的完整代码!只有与我的问题相关的代码。

    IUnitofWork接口:

    IQueryable<T> GetList<T>();
    

    工程单位混凝土等级:

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

    ifoorepository接口

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

    基础混凝土等级

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

    映射文件指定条是延迟加载的,但是在我的ThisYearsForsRepository属性中,我想指定条应该被热切加载以避免N+1选择。

    在linq-to-nhibernate中,我们可以使用expand()扩展方法指定预取。但是,此扩展方法属于nhibernatequeryable类型,而iunitofwork接口的getlist方法只知道iqueryable。

    显然,我不想让iUnitOfWork界面了解InhibernateEqueryable,因为它不应该知道nhibernate。

    使用我上面指定的设计,有没有一种方法可以做到这一点,我还没有想到呢?还是我的设计需要重新考虑?

    谢谢

    戴维

    2 回复  |  直到 14 年前
        1
  •  2
  •   Diego Mijelshon    14 年前

    升级至nhibernate 3.x.对应于expand的新方法( Fetch )在iqueryable上操作。

        2
  •  0
  •   Paco    14 年前

    你说的是一些矛盾的事情: -您不想公开接口 -您要使用该接口

    那是不可能的。你必须重新考虑你的设计。 你用“工作单位”这个词来表示与大多数人不同的事情。 大多数人都希望一个工作接口单元有提交和回滚方法,但不希望有一些IQueryable方法。