首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate / Castle.ActiveRecord;会话管理;WinForms

NHibernate / Castle.ActiveRecord;会话管理;WinForms
EN

Stack Overflow用户
提问于 2012-01-05 08:13:36
回答 1查看 524关注 0票数 4

我的第一个真正的(非测试) NHibernate/Castle.ActiveRecord项目正在快速开发。我现在使用NHibernate/Castle.ActiveRecord大约一个月,但仍然不知道如何在我的WindowsForms应用程序中处理会话。

常见的处理方法seam不适合我:

  • SessionPerRequest,、SessionPerConversation等都只为WebApplications工作,当我是correct
  • SessionPerThread时,etc.
  • SessionPerApplication并不是很危险/非常危险,因为我要么只有一个线程,WindowsForms线程,要么每个按钮单击一个新线程。第一件事将使我的应用程序使用太多的内存,并将旧的对象保存在内存中。使用工作线程进行技术按钮单击,我将禁用延迟加载,因为我加载的对象将比thread.
  • SessionPerPresenter的寿命更长,因为通常情况下,我会以一种形式打开一个“子演示器”,让用户搜索/加载/选择一些引用对象(foreigen键),从而破坏演示者--这意味着会话关闭--但是在“超级演示器”中使用的对象填充引用属性(

)。

我使用谷歌和必应已经好几个小时了,也读了很多书,但我只找到了一个关于我的案例的好网站:http://msdn.microsoft.com/en-us/magazine/ee819139.aspx。在那里使用SessionPerPresenter,但是对于“子演示者”,它只给出id,而不是整个对象!而且,这个例子中没有预见键,也没有场景对象被返回给“超级演示者”。

Qestions

windowsforms/desktop-application?

  • I有任何其他会话处理方法可以为我的所有演示者添加会话属性或会话构造函数参数,但是让会话-在我的ui-code.

  • When中处理所有会话都是不对的--一个异常发生了NHibernate想让我杀死会话。但是如果它只是一个业务逻辑异常而不是一个NHibernate-Exception?

示例

我正试着以一个例子来掩盖我的大部分问题。

代码语言:javascript
复制
// 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;}
}

代码语言:javascript
复制
// 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-instance实例搜索和选择对象

  1. 使用BoxSearchPresenter的一部分是使用ProductSearchPresenter的实例来填充BoxSearchPresenter
  2. 的条件

使用一个UserSearchPresenter

  • part实例搜索和选择一个对象(
  1. )这一用法的一部分是使用UserEditPresenter实例来编辑和保存这个UserSearchPresenter的狭长对象,即使用ProductSearchPresenter来搜索和选择将添加到User.AssignedProducts.

中的对象

  1. 使用ProductSearchPresenter实例搜索和选择对象。ProductSearchPresenter.

的一部分是使用ProductEditPresenter实例来编辑和保存选定的

  • 对象。

这只是一小部分用例,但我有很多问题。

在同一个ui-thread.

  • UseCase 1.1中同时运行
  • UseCase 1和2。和2.2。将选定的对象返回给使用此对象的其他演示程序,比加载object.
  • UseCase 3.1的演示程序存在更长的时间。可能会更改从2.2./1.1加载的对象。3.1之前。已经启动,但当2.2/1.1。在3.1之前就开始了。完成后,将保存对象,并且不可能“回滚”3.13.1.

EN

回答 1

Stack Overflow用户

发布于 2012-01-13 19:12:34

下面是我发现最适合我们的WinForms应用程序体系结构(基于MVP)的一个简短的视图。

每个演示者都是依赖于它所需要的存储库的构造函数,例如,如果您有InvoicePresenter,那么您就有InvoiceRepository作为依赖项,但是您可能会有CustomerRepository和其他许多依赖于复杂性的构造器(如果您想要更改发票的客户,那么就可以使用CustomerRepsitory将所有客户加载到combobox )。

然后,每个存储库都有一个用于UnitOfWork的构建器参数。您可以使用UnitOfWork模式抽象会话,也可以让您的报告依赖于ISession。

所有东西都由IoC容器连接在一起,在这里我们创建基于“上下文”的表演者。这是一个非常简单的概念,上下文是每个演示者和所有子演示者,这反过来我们创建为更复杂的演示者的复合块,以减少肤色(例如,如果您有多个选项标签来编辑某个实体或其他东西)。

因此,在实践中,这个上下文是基于90%的时间表单,因为一个表单至少是一个演示者/视图。

因此,要回答你的问题:

每个演讲者的

  1. 会话和每个会话的会话(也适用于WinForms )在这里只是真正有用的模式(以及在各地打开闭幕式,但并不是很好的处理方法)--
  2. --最好通过使存储库依赖于会话而不是演示者来解决。您使演示员依赖于存储库,存储库依赖于会话,当您创建所有存储库时,您会给它们提供公共会话;但是正如我再次声明的那样,只有在上下文中这样做才是可行的。您不能共享演示者编辑发票的会话和另一个演示者编辑客户的会话;但是您可以在通过主演示者编辑发票时共享会话,通过发票详细信息和发票备注presenter.
  3. Please澄清,不理解这一点.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8739457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档