Fluent nhibernate 在哪里放置NHibernate查询逻辑?

Fluent nhibernate 在哪里放置NHibernate查询逻辑?,fluent-nhibernate,domain-driven-design,linq-to-nhibernate,Fluent Nhibernate,Domain Driven Design,Linq To Nhibernate,我正在尝试使用Fluent-NHibernate和Linq-to-NHibernate建立适当的域体系结构。我让我的控制器调用我的存储库类,这些类在引擎盖下执行NHibernate任务并传回数据的ICollections。这似乎工作得很好,因为它抽象了数据访问,并将NHibernate功能保留在“细节”中 然而,现在我发现我的控制器需要在不同的上下文中使用相同的数据调用。例如,my repo返回一个用户列表。当我想显示用户列表时,这很好,但是当我想开始利用子类来显示角色等时,我遇到了select

我正在尝试使用Fluent-NHibernate和Linq-to-NHibernate建立适当的域体系结构。我让我的控制器调用我的存储库类,这些类在引擎盖下执行NHibernate任务并传回数据的ICollections。这似乎工作得很好,因为它抽象了数据访问,并将NHibernate功能保留在“细节”中

然而,现在我发现我的控制器需要在不同的上下文中使用相同的数据调用。例如,my repo返回一个用户列表。当我想显示用户列表时,这很好,但是当我想开始利用子类来显示角色等时,我遇到了selectn+1问题。我知道如何在NHibernate中改变这一点,所以它使用连接,但我的具体问题是,我应该把这个逻辑放在哪里?我不希望每个GetAllUsers()调用也返回角色,但我确实希望其中一些返回

下面是我看到的三个选项:

  • 更改“我的映射”中的设置,以便将角色加入到我的查询中
  • 创建两个存储库调用-GetAllUsers()和GetUsersAndRoles()
  • 将我的IQueryable对象从存储库返回到控制器,并使用NHibernate展开方法

  • 对不起,如果我没有解释清楚的话。我刚刚开始使用DDD,很多这个术语对我来说还是新的。谢谢

    我尝试将所有查询逻辑保留在我的存储库中,并尝试只从存储库传回ICollection

    在您的情况下,我将传入一些参数,以确定您是否希望加载角色,并以这种方式构造IQueryable。例如:

    GetAllUsers(bool loadRoles)
    {
        var query = session.Linq<Users>();
        if(loadRoles)
           query.Expand("Roles");
        return query.ToList();
    }
    
    GetAllUsers(bool加载角色)
    {
    var query=session.Linq();
    如果(加载角色)
    查询。展开(“角色”);
    返回query.ToList();
    }
    
    我会选择2,创建两个存储库。也许我会考虑对GetRoleByUser(用户用户)创建另一个存储库调用。因此,如果需要,您可以在单独的线程上更改用户选择后访问用户的角色,这样可以提高您的性能,并且不会为每个用户加载每个用户的角色,这将需要大部分资源。

    听起来您在问是否可以有时只返回用户实体,有时返回用户和角色

    我可以创建一个名为
    GetRolesForUser(User-User)
    的单独存储库方法,对角色使用延迟加载,或者使用lomaxx的回答中提到的
    GetAllUsers(bool-loadRoles)


    我倾向于延迟加载角色或存储库中的单独方法。

    正如lomaxx所指出的,您需要query.Expand

    为了防止存储库因各种可能的情况而被各种方法所掩盖,您可以创建查询对象来进行可配置查询


    我发布了一些使用icriteriaapi的示例。icriteriaapi使用了
    FetchMode
    而不是
    Expand
    ,但想法是一样的。

    我喜欢这个答案,但我可以看到它在复杂的情况下变得疯狂。我的场景非常简单-我的真实情况有很多子对象。