如何将SOA与nHibernate结合使用?

如何将SOA与nHibernate结合使用?,nhibernate,soa,Nhibernate,Soa,首先,我将澄清一些词:当我使用“用户”这个词时,您必须理解“应用程序用户”,而“患者”是模型层的一个“项目” 现在让我们解释一下上下文: 客户端应用程序有一个按钮“获取患者”和“更新”、一个文本框“患者姓名”和一个网格,用于显示单击“获取患者”按钮后返回的患者 在服务器端,我有一个WCF方法GetPatient(字符串名),它搜索回收的患者,并对nHibernate使用的Patiententy执行一些业务逻辑。该方法返回PatientTo(Patiententy的映射)。我有一个更新(Pati

首先,我将澄清一些词:当我使用“用户”这个词时,您必须理解“应用程序用户”,而“患者”是模型层的一个“项目”

现在让我们解释一下上下文:

  • 客户端应用程序有一个按钮“获取患者”和“更新”、一个文本框“患者姓名”和一个网格,用于显示单击“获取患者”按钮后返回的患者

  • 在服务器端,我有一个WCF方法GetPatient(字符串名),它搜索回收的患者,并对nHibernate使用的Patiententy执行一些业务逻辑。该方法返回PatientTo(Patiententy的映射)。我有一个更新(PatientTo patient)方法来更新修改过的患者

  • 用户可以修改返回的PatientTo并单击“更新”按钮

到目前为止,我有两个想法可以通过这个senario来管理“会议”:

  • 第一个想法:我在我的DTO中公开一个“ID”属性,这样当用户单击更新时,我在服务器端使用nHibernate的“GetByID()”搜索具有指定ID的“patient”,我使用PatientTo的数据更新结果,并调用nHibernate的“update()”方法

  • 第二个想法:我在服务器端手动创建一个CustomSession(为了清楚起见,我使用这个名称)类,它封装了一个ISession,并公开了一个会话的唯一id,该id将在客户端和服务器之间传输。因此,当客户端向服务器发送PatientTo和唯一会话id时,我可以获取CutsomSession并使用ISession的update()方法更新患者

我不喜欢这些想法。因为第一个是大量的开销,并且它没有使用nHibernate的特性。第二个想法要求开发人员自己管理调用之间CustomSession的id:这很容易出错

此外,我确信nHibernate提供了这样一种机制,尽管我在谷歌上搜索了一下,并没有发现这方面的任何信息

那么我的问题是:

  • 我应该使用什么机制(模式)?当然,该机制应该支持实体的对象图,而不是单个实体!"
  • nHibenrate是否提供了这样一种机制*

提前感谢您的帮助,

在客户机-服务器编程中,我通常不使用ORM工具/框架的一个原因是,通常情况下,您会使用它们获得第一个解决方案。这有助于使服务器端更无状态(从而更具可扩展性),而代价是一些合理廉价的数据库调用(通过PK获取通常非常便宜,如果您立即写入它,猜猜数据库在写入时可能首先做什么?抓取旧记录-因此选择/更新可能只比仅更新稍微慢一点,因为它为缓存种子)


是的,你正在手工做一些你想推到ORM上的事情-这就是生活。在你测量它之前不要担心性能-对于这个特殊的情况,我想知道你是否真的可以测量它。

我不认为这是一个Hibernate问题,在我看来这是一个常见的误解。Hibernate是一个OR映射器,因此删除您的数据库对象并提供基本的事务支持。差不多就是这样。
例如,客户机-服务器环境中的会话管理解决方案是使用Spring.net,它确实为您的问题提供解决方案(搜索OpenSessionInView),并与NHibernate很好地集成。
与基于会话的解决方案相比,您提到的无状态方法提供了许多优势。例如,考虑并发性。如果您的comitt是无状态的,您只需在客户端对失败的Save()操作做出反应,例如重新加载视图。

除此之外,关于Hibernae使用的两个很好的论点是,如果操作正确,安全性攻击SQL注入。

下面是一个总结:

  • nHibernate会话持续服务调用的时间,即“GetPatient(string name)”的调用时间不再持续
  • 服务器处理实体并将DTO返回给客户端
  • 客户端显示并更新DTO,并调用服务“更新(PatientTo patient)”
  • 当客户端触发服务“Update(PatientTo patient)”时,映射器将通过DTO中包含的带有“GetById(int ID)”的ID获取患者实体,并更新必须更新的属性
  • 最后,服务器调用nHibernate的“Update()”来持久化所有更改

即使我正在使用您的解决方案,我也认为至少有两个理由仍然使用ORM:*ORM与数据库无关,所以我可以通过修改配置文件来更改它*我不必费心编写SQL(这是一个相关的评论,因为我是C#lad,LINQ至少对我的项目来说比SQL更好)