【问题标题】:How use SOA with nHibernate?如何将 SOA 与 nHibernate 一起使用?
【发布时间】:2011-07-10 18:06:51
【问题描述】:

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

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

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

  • 在服务器端,我有一个 WCF 方法 GetPatient(string name),它搜索回收的患者并对与 nHibernate 一起使用的 PatientEntity 执行一些业务逻辑。该方法返回一个 PatientDto(来自 PatientEntity 的映射)。而且我有一个 Update(PatientDto patient) 方法来更新修改后的病人。

  • 用户可以修改返回的PatientDto并点击“更新”按钮。

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

  • 第一个想法:我在 DTO 中公开了一个“ID”属性,因此当用户单击更新时,我会在服务器端搜索“ patient" 使用 nHibernate 的 "GetByID()" 指定 ID,我使用来自 PatientDto 的数据更新结果并调用 nHibernate 的 "Update()" 方法。

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

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

此外,我确信 nHibernate 提供了这样的机制,尽管我在谷歌上搜索并没有发现任何相关信息。

那么我的问题是:

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

提前感谢您的帮助,

【问题讨论】:

    标签: nhibernate soa


    【解决方案1】:

    我不认为这是一个 Hibernate 问题,并且在我看来这是一个常见的误解。 Hibernate 是一个 OR-Mapper,因此可以处理您的数据库对象并提供基本的事务支持。差不多了。
    客户端-服务器环境中会话管理的解决方案是例如使用例如Spring.net 确实为您的问题提供了解决方案(搜索 OpenSessionInView),并与 NHibernate 很好地集成。
    与基于会话的解决方案相比,您提到的无状态方法提供了许多优势。例如考虑并发性。如果您的提交是无状态的,您可以简单地对客户端的失败 Save() 操作做出反应,例如通过重新加载视图。
    除了您对使用 Hibernae 的 2 个很好的论据之外,如果做得好,安全性会对抗 SQL 注入。

    【讨论】:

      【解决方案2】:

      我通常不在客户端-服务器编程中使用 ORM 工具/框架的一个原因是,您通常会使用它们获得第一个解决方案。它有助于使服务器端更加无状态(因此更具可扩展性),但代价是一些相当便宜的数据库调用(按 PK 获取通常非常便宜,如果您立即编写它,猜猜数据库可能是什么在写入时先做?抓取旧记录 - 因此 SELECT/UPDATE 可能只比 UPDATE 稍微慢一点,因为它为缓存提供种子)。

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

      【讨论】:

      • 即使我正在使用您的解决方案,我仍然看到至少 2 个理由仍然使用 ORM: * ORM 与 DB 无关,因此我可以通过修改配置文件来更改它 * 我不费心编写 SQL (这是一个相关的评论,因为我是 C# 小伙子,而 LINQ 至少对我的项目来说比 SQL 更好;))
      【解决方案3】:

      以下是对上述内容的总结:

      • nHibernate 会话持续服务调用的时间。也就是不再调用“GetPatient(string name)”的时间了。
      • 服务器使用实体并将 DTO 返回给客户端。
      • 客户端显示和更新 DTO。并调用服务“Update(PatientDto patient)
      • 当客户端触发服务“Update(PatientDto patient)”时,映射器通过 DTO 中包含的 ID 和“GetById(int id)" 并更新必须的属性。
      • 最后,服务器调用 nHibernate 的“Update()”来持久化所有更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        相关资源
        最近更新 更多