我目前正在使用基于属性的方法来进行nhibernate会话管理,这意味着会话在Action方法的持续时间内是打开的,但是一旦控件传递给View就会关闭。
这对我来说似乎是一种很好的做法,然而我正在遇到延迟加载集合的问题。(这很复杂,因为有些集合似乎是延迟加载,即使它们有Not.LazyLoad()在流畅的映射中设置。)
我认为,我的选择是:
1似乎有点不对 - 但可能是'最简单'的解决方案。 2可能是正确的方法,但在某些情况下,ViewModel似乎有点多余,我厌恶引入更多的类来处理这个问题。 3似乎有点肮脏。
您怎么看?
答案 0 :(得分:3)
处理此问题的最佳方法(我认为无论如何)是在您的UI和您的存储库之间引入服务层;它应该负责加载视图所需的所有内容,并将展平(并完全填充)的dto传递给视图。
通常,我更进一步,将从服务层返回的dtos映射到视图模型,这些模型通常需要包含特定于视图的数据,并且不适合包含在来自服务层的dtos中。请记住,在这种情况下,Automapper是您的朋友。
使用open-session-in-view模式仍然是完全可以接受的,只是没有你的视图调用实体模型上的延迟加载 - 这几乎总是一个可怕的想法。
答案 1 :(得分:1)
将您当前的用法视为进行隐式数据库操作。该对象被发送到View,但该对象包含代理,当被触摸时将尝试返回数据,这需要数据库操作。
现在,
注意:虽然您可能已将一个集合映射为非延迟加载,但您查询如何并获得所需的结果集也很重要。例如,如果您使用的是HQL,请使用获取连接
答案 2 :(得分:0)
我认为第一种方法没有任何问题,而且最容易实施。
每个请求的会话是一个众所周知的NHibernate会话管理模式。