gpt4 book ai didi

nhibernate - 对 nHibernate 的 ISession 和 Eager Loading 的关注点分离感到困惑

转载 作者:行者123 更新时间:2023-12-04 06:32:11 24 4
gpt4 key购买 nike

我有一个使用 Fluent NHibernate 和 ASP.NET MVC 构建的应用程序。目前分为5个项目。

网络

ASP.NET MVC 项目仅包含 HTML、CSS、 Controller 和非常特定于项目的验证器和模型绑定(bind)器,以及 IoC 容器 Ninject
楷模

Models 项目包含域对象 IRepository<T> , 使用 Repository 的服务,以及与数据库操作无关的辅助代码。

坚持

Persistence 项目包含 Fluent nHibernate 映射,ISessionFactory映射,Repository<T> : IRepository<T>实现等

持久性.实用程序

这是一个辅助项目,与我的实际最终产品无关。这是我放置测试数据库种子、用于快速设置的默认集​​合等内容的地方。

测试

单元测试项目

我遇到的问题在 Models 之间一个 Persistence .有时我需要使用急切加载。在 nHibernate 中,我会使用 Query<T>().Fetch(...)去做这个。这可以正常工作,除了 Models.dll没有nHibernate的概念。除了System.dll,它没有任何库的概念。并且是完全独立的。

有没有一种特定的方法可以将急切加载功能添加到我的 IRepository 中?不知道NHibernate.Linq ?我无法添加采用任何类型的 lambda 表达式的方法,其中包括 Fetch因为我的持久层在模型层中不存在。但是 IRepository<T>存在于模型层,因为它用在Service对象中,同样没有数据库的概念。他们只需访问适当的存储库。存储库不暴露于 Web层,只是适当的服务。

有任何想法吗?

最佳答案

我想我理解你......所以它基本上归结为你如何实现存储库模式。您可以在流利的映射中设置预加载,但无论如何,听起来您只想在少数情况下进行预加载,因此 NHibernate 的内容仍然需要使用当前设置泄漏到您的模型项目中。

回到整个存储库模式的事情,我能想到的一个选择是让你的存储库更智能一些。

例如。在您的 Models项目有:

public interface IFooRepository : IRepository<Foo>
{
IQueryable<Foo> GetAllFoosWithBars();
}

然后在你的 Persistence项目有:
public class FooRepository : Repository<Foo>, IFooRepository
{
public IQueryable<Foo> GetAllFoosWithBars()
{
return this.Session.Query<Foo>().Fetch(c => c.Bars);
//I don't know the return type for .Fetch() off the top of
//my head, so you might need a .AsQueryable() in there
}
}

关于nhibernate - 对 nHibernate 的 ISession 和 Eager Loading 的关注点分离感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com