Asp.net mvc Net MVC、ORM和;沉重的;物体

Asp.net mvc Net MVC、ORM和;沉重的;物体,asp.net-mvc,nhibernate,Asp.net Mvc,Nhibernate,我认为这个问题在具有中等规模模型的web应用程序中很常见。 比如说,我有一个体育中心的班级拿着一张篮球场的名单 显示我仍想显示的篮球场的保留或属性 关于它所属的SportCenter的信息很少 我在数据层使用ASP.Net MVC和nHibernate,所以我的问题是: 让nHibernate加载整个SportCenter实例(实际上)是否值得 包含的集合是延迟加载的,但类仍然是“重的”) 我的篮球场和它的信息只是为了展示我的几个领域 运动中心 另一方面,在HQL中构建非常精细的查询会让我回到过

我认为这个问题在具有中等规模模型的web应用程序中很常见。 比如说,我有一个体育中心的班级拿着一张篮球场的名单 显示我仍想显示的篮球场的保留或属性 关于它所属的SportCenter的信息很少

我在数据层使用ASP.Net MVC和nHibernate,所以我的问题是: 让nHibernate加载整个SportCenter实例(实际上)是否值得 包含的集合是延迟加载的,但类仍然是“重的”) 我的篮球场和它的信息只是为了展示我的几个领域 运动中心

另一方面,在HQL中构建非常精细的查询会让我回到过去 手动SQL查询的经典ASP天

有什么好的建议吗


谢谢大家,彼得。

试一下,运行一下,分析一下。尝试两种方法,并使用类似的配置文件来查看是否存在明显的性能差异

如果没有那么大的区别,那么使用可读性更强的版本-使用SportCenter类-否则,使用HQL


IMHO或/Ms在其当前状态下不能完全替代SQL/variants。

如果您从篮球场端查询它,则每个篮球场可以“获取加入”运动中心,或从篮球场端关闭延迟加载(因为每个篮球场只有一个运动中心)


我在这方面遇到的主要开销来自nHibernate使用大量小的延迟负载对数据库的破坏,解决方案通常是让它在一次往返中返回所有数据

我越来越相信命令/查询分离(Greg-Young版本),因此我想说,如果你想向用户显示数据(查询),你绝对不应该使用你的域模型。当涉及到一个好的领域时,getter通常是一种反模式


我目前首选的过程是使用NHibernate填充的特定于屏幕的DTO。当从一个单独的表中驱动时,它们工作得最好,但您可以使用NHibernates AliasToBeanTransformer从域表中填充。

考虑Linq。NHibernate支持Linq。使用Linq,很容易编写返回“部分对象”或任何您真正想要的字段的类型安全查询

您介绍的其他两个选项可能“足够好”,应该可以使用

正如person-b所说,如果您关心性能,请使用分析器


特定于视图的DTO是一种最佳实践,在这里可能有意义。

您的问题是您将域暴露给UI层。您应该将模型与ViewModel分开。

但是特定于屏幕的DTO使业务层意识到并依赖于UI层,至少在语义上是如此,这是不好的。即使只是为了生成“视图”而从nHibernate中编写特定的查询,也会破坏只有nHibernate的数据访问层。不管怎样,你的观点听起来很有动机,你说的“当涉及到一个好的领域时,getter通常是一个反模式”到底是什么意思?感谢您的回答,Peter。实际上,您的DTO应该位于一个单独的查询层中,该层的唯一任务是满足客户端查询的需要,在这种情况下,依赖关系(imho)是可以的。业务层(或者在我的例子中是域层)是为服务命令而存在的。吸气剂的问题是,它们很快会导致贫血。如果每个人都能得到你的所有数据(应该是私有的),那么他们为什么需要你为他们做任何事情呢?自从我读到实用程序员的“告诉,不要问”原则以来,我一直在努力在我的设计中保留更多的OO。