假设我有一个简单的视图,显示产品名称以及是否已停产。我正在从Northwind数据库中提取数据。我使用简单的模型视图模式和带NHibernate的DAO模式。当表单加载时,我的UI有一个加载按钮和一个保存按钮。如果我点击加载按钮而不是我后面的代码,我只需将调用传递给我的Presenter即可加载数据。 preseneter调用DAO获取数据并使用数据填充视图。比我点击保存按钮。我的代码后面再次将调用传递给演示者。演示者需要拥有在Load上创建的会话对象来执行乐观并发,更改跟踪等...
所以我的问题是我在哪里创建我的ISession对象,以便它可以改变跟踪和乐观并发?
答案 0 :(得分:0)
HTTP是无状态的。您的工作单元仅存在于服务器端。至于点击“加载”,你的UOW只需检索记录并映射到你的视图模型。当你点击服务器时,“保存”和工作单元开始 - 而不是在负载过程中,在浏览器中编辑,然后再返回到服务器。
实施方面你不应该将ISession保留在内存中(在你的情况下是ASP.Net会话对象),这是耗尽内存和非托管ado.net资源的必然快捷方法。有些人选择将一个ISession与begin_request上的HTTP上下文相关联,并在end_request上配置各种UOW示例,你当然可以更精细,但在所有情况下它都不会存在。
在一个简单的系统中,在点击“保存”时,您需要使用ID(隐藏字段或不是)将产品从数据库中拉出,从Request.Form设置属性,然后在数据库中。
至于并发性。如果您在隐藏字段中记录时间戳或增量版本
<input type="hidden" name="version" value="12"/>
然后当你点击Save时,你将Product拉出数据库,检查Request.Form中的版本号是否匹配然后保存,如果没有返回给用户自上次检索以来数据已经改变,你会吗?喜欢继续吗? NHibernate有时间戳/版本字段,所以当你实际上在DB上点击DB基本上是一个where子句时进行比较,所以在这个例子中它甚至考虑到你提交的那一刻的变化。
有更精细和复杂的方法,但通常你不能/不应该在你的asp.net Session对象中坚持使用ISession。
答案 1 :(得分:0)
由于您正在使用MVP,我将假设这是一个桌面应用程序,而不是Web应用程序。 UnitOfWork是一个很好的模式,就像“Persistent Conversation”一样。 Ayende最近写了一篇关于building a desktop application with nhibernate的优秀文章,所以我肯定会看一下。