【发布时间】:2012-01-05 08:13:36
【问题描述】:
我的第一个真实(非测试)NHibernate/Castle.ActiveRecord 项目正在快速发展。 我正在使用 NHibernate/Castle.ActiveRecord 大约一个月,但仍然不知道如何在我的 WindowsForms 应用程序中处理会话。
常见的处理方法对我不起作用:
- SessionPerRequest、SessionPerConversation 等都只适用于 WebApplications 等。
- 如果我是正确的,SessionPerApplication 不被推荐/高度危险
- SessionPerThread 不是很有帮助,因为我要么只有一个线程,即 WindowsForms 线程,要么为每个按钮单击一个新线程。第一件事会让我的应用程序使用太多内存并将旧对象保存在内存中。使用 ech 按钮单击的工作线程我会禁用延迟加载,因为我加载的对象会比线程寿命更长。
- SessionPerPresenter 无法正常工作,因为我在表单中打开一个“子演示者”以让用户搜索/加载/选择一些引用对象(外键)并导致演示者被破坏,这很常见- 会话关闭是什么意思 - 但在“超级演示者”中使用的对象填充引用属性(外键)。
我已经使用 google 和 bing 几个小时并且阅读了很多,但只找到了一个关于我的案例的好网站:http://msdn.microsoft.com/en-us/magazine/ee819139.aspx。使用了 SessionPerPresenter,但对于“子演示者”,它只给出了 id,而不是整个对象!并且在这个例子中似乎没有外键,也没有将对象返回给“超级演示者”的场景。
问题
- 还有其他方法可以处理 windowsforms/desktop-application 的会话吗?
- 我可以为所有演示者添加会话属性或会话构造函数参数,但在我的 ui 代码中进行会话处理感觉不对。
- 当发生异常时,NHibernate 要求我终止会话。但如果它“只是”一个业务逻辑异常而不是 NHibernate-Exception?
示例
我试图举一个例子来解决我的大部分问题。
// The persisten classes
public class Box
{
public virtual int BoxId{get;set;}
public virtual Product Content{get;set;}
...
}
public class User
{
public virtual int UserId{get;set;}
public virtual IList<Product> AssigenedProducts{get;set;}
...
}
public clas Product
{
public virtual int ProductId{get;set;}
public virtual string PrductCode{get;set;}
}
.
// The presenter-classes
public class ProductSearchPresenter : SearchPresenter<Product> { ... }
public class ProductEditPresenter : EditPresenter<Product> { ... }
public class UserSearchPresenter : SearchPresenter<User> { ... }
public class UserEditPresenter : EditPresenter<User> { ... }
public class BoxSearchPresenter : SearchPresenter<Box> { ... }
public class BoxEditPresenter : EditPresenter<Box> { ... }
// The search-presenters allow the user to perform as search with criterias on the class defined as generic argument and to select one of the results
// The edit-presenters allow to edit a new or loaded (and given as parameter) object of the class defined as generic argument
现在我有以下用例,所有这些都可以在同一个应用程序中同时异步执行(使用只是在演示者之间切换)。
- 使用 BoxSearchPresenter 实例搜索和选择对象
- 这个用例的一部分是使用 ProductSearchPresenter 的实例来填充 BoxSearchPresenter 的条件
- 这个用例的一部分是使用 BoxEditPresenter 的实例来编辑和保存 BoxSearchPresenter-instance 的选定对象
- 使用 UserSearchPresenter 的实例来搜索和选择对象
- 此用例的一部分是使用 UserEditPresenter 的实例来编辑和保存 UserSearchPresenter 的选定对象
- 此用例的一部分是使用 ProductSearchPresenter 来搜索和选择将添加到 User.AssignedProducts 的对象。
- 使用 ProductSearchPresenter 的实例来搜索和选择对象。
- 此用例的一部分是使用 ProductEditPresenter 的实例来编辑和保存 ProductSearchPresenter 的选定对象。
这只是一小部分用例,但我遇到的问题已经很多了。
- 用例 1. 和 2. 在同一个 ui 线程中同时运行。
- 用例 1.1。和 2.2。将选定的对象返回给使用此对象的其他演示者的时间比已加载该对象的演示者存在的时间长。
- 用例 3.1。可能会改变从 2.2./1.1 加载的对象。 3.1之前。已启动,但当 2.2./1.1.在 3.1 之前提交。完成后,对象将被保存,并且无法“回滚” 3.1。
【问题讨论】:
标签: winforms nhibernate desktop-application castle-activerecord session-management