如何将SOA与nHibernate结合使用?
首先,我将澄清一些词:当我使用“用户”这个词时,您必须理解“应用程序用户”,而“患者”是模型层的一个“项目” 现在让我们解释一下上下文:如何将SOA与nHibernate结合使用?,nhibernate,soa,Nhibernate,Soa,首先,我将澄清一些词:当我使用“用户”这个词时,您必须理解“应用程序用户”,而“患者”是模型层的一个“项目” 现在让我们解释一下上下文: 客户端应用程序有一个按钮“获取患者”和“更新”、一个文本框“患者姓名”和一个网格,用于显示单击“获取患者”按钮后返回的患者 在服务器端,我有一个WCF方法GetPatient(字符串名),它搜索回收的患者,并对nHibernate使用的Patiententy执行一些业务逻辑。该方法返回PatientTo(Patiententy的映射)。我有一个更新(Pati
- 客户端应用程序有一个按钮“获取患者”和“更新”、一个文本框“患者姓名”和一个网格,用于显示单击“获取患者”按钮后返回的患者
- 在服务器端,我有一个WCF方法GetPatient(字符串名),它搜索回收的患者,并对nHibernate使用的Patiententy执行一些业务逻辑。该方法返回PatientTo(Patiententy的映射)。我有一个更新(PatientTo patient)方法来更新修改过的患者
- 用户可以修改返回的PatientTo并单击“更新”按钮
- 第一个想法:我在我的DTO中公开一个“ID”属性,这样当用户单击更新时,我在服务器端使用nHibernate的“GetByID()”搜索具有指定ID的“patient”,我使用PatientTo的数据更新结果,并调用nHibernate的“update()”方法
- 第二个想法:我在服务器端手动创建一个CustomSession(为了清楚起见,我使用这个名称)类,它封装了一个ISession,并公开了一个会话的唯一id,该id将在客户端和服务器之间传输。因此,当客户端向服务器发送PatientTo和唯一会话id时,我可以获取CutsomSession并使用ISession的update()方法更新患者
- 我应该使用什么机制(模式)?当然,该机制应该支持实体的对象图,而不是单个实体!"
- 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()”来持久化所有更改