假设我有一个简单的视图,其中显示了产品名称以及它是否已停产。我正在从Northwind数据库中提取数据。我在NHibernate中使用了一个简单的模型视图模式和一个DAO模式。当表单加载时,我的UI带有一个加载按钮和一个保存按钮。如果我点击了Load按钮,而不是在后面的代码中,我只需将调用传递给我的展示者来加载数据。呈现者调用DAO来获取数据并用数据填充视图。然后我按下保存按钮。我的代码再一次将调用传递给展示者。展示者需要拥有在加载时创建的会话对象,以执行乐观并发、更改跟踪等操作。
所以我的问题是,我应该在哪里创建我的ISession对象,以便它可以执行更改跟踪和乐观并发?
发布于 2009-07-11 05:39:33
HTTP是无状态的。您的工作单元仅存在于服务器端。至于单击'Load‘,那么您的UOW只是检索记录并映射到您的视图模型。“保存”和工作单元在你访问服务器时开始-而不是在加载过程中,在浏览器中编辑,然后返回到服务器。
在实现方面,您不应该将ISession保存在内存中(在本例中为ASP.Net session对象),这肯定是耗尽内存和非托管ado.net资源的快速方法。有些人选择在begin_request中将ISession与HTTP上下文相关联,并在end_request上进行处置,当然可以更细粒度,但在所有情况下,它都不会再存在了。
在一个简单的系统中,点击“保存”后,您将需要使用一个ID (隐藏字段或其他字段)将产品从数据库中拉出,从Request.Form设置属性,然后在数据库中更新。
至于并发性。如果您在隐藏字段中记录时间戳或增量版本
<input type="hidden" name="version" value="12"/>有更复杂和复杂的方法,但通常你不能/不应该在你的asp.net会话对象中粘贴ISession。
发布于 2009-12-29 06:38:34
既然你使用的是MVP,我就假设这是一个桌面应用程序,而不是web应用程序。与"Persistent Conversation“一样,UnitOfWork是一个很好的模式。Ayende最近在building a desktop application with nhibernate上写了一篇很棒的文章,所以我一定会看一看。
https://stackoverflow.com/questions/1113002
复制相似问题