【问题标题】:Will Dapper for retrieval and NHibernate for CRUD work for a web application用于检索的 Dapper 和用于 CRUD 的 NHibernate 是否适用于 Web 应用程序
【发布时间】:2012-08-26 23:37:55
【问题描述】:

我计划使用“Dapper”进行检索,使用“NHibernate”进行 CRUD 操作。那么,遵循这种方法是否是一个好的设计。我最近遇到的问题之一是 CRUD 屏幕。

假设我有编辑订单表格。我正在从 Dapper 检索实体(订单)并在更新它时需要将这些对象附加到 NHibernate 会话以执行 CRUD 操作。这不是直接需要的,我的意思是 object.delete()。

谁能提供有关此设计的建议,是否有可能使它变得更好。它是使用 asp.net mvc 3 开发的 Web 应用程序。


关于回复的问题:

  1. 操作上的会话过滤器是否意味着我们用于当前操作的内容。如果是,对于 GET 操作,应该是 [DapperSession] 而不是 [NHSession]?

    [NHSession]

    • DapperSession.Get.Entity(1000)
    • 返回视图
  2. 我仍在尝试了解您发布的 PRG 模式,如果我有任何疑问,我会发布。

  3. 由于所有这些都发生在“编辑”操作中,明智的做法是也使用 NHibernate 获取对象。这以很少的开销成本摆脱了所有这些过程。

【问题讨论】:

    标签: asp.net-mvc-3 nhibernate dapper


    【解决方案1】:

    乍一看,这似乎是一个合乎逻辑的选择,将 Dapper(或其他微型 ORM)用于 GET 并将 NHibernate 用于控制器上的任何 POST 操作方法。见伪代码):-

    [DapperSession]
    GET ACTION RESULT
      - DapperSession.Get.Entity(1000)
      - Return view
    

    对于 post 方法

    [NHSession, DapperSession]
    POST ACTION RESULT
      If Model.State is valid
        - entity = NHSession.Get.Entity(1000)
        - update entity
        - redirect to ...
      end if
    
     - DapperSession.Get.Entity(1000)
     - return view
    

    正如您所见,这并不是那么优雅,因为您可能需要对 POST 操作结果使用不同的操作过滤器。为了解决这个问题,您可以使用 Post Redirect Get (PRG) 模式,因此 GET 控制器使用 Dapper,而 POST 控制器只能访问 NHSession。

    有关如何设置此模式的详细信息,请参阅accepted answer on SO

    现在您的 GET 和 POST 操作结果将如下所示:-

    [DapperSession, ImportModelStateFromTempData]
    GET ACTION RESULT
      - DapperSession.Get.Entity(1000)
      - Return view
    

    对于 post 方法

    [NHSession, ExportModelStateToTempData]
    POST ACTION RESULT
      If Model.State is valid
        - entity = NHSession.Get.Entity(1000)
        - update entity
        - redirect to ...
      end if
    
     - return redirect to GET
    

    但是,正如您所见,我真正所做的只是将一个操作过滤器属性替换为另一个。但是(这是一个很大的问题,但在我看来)你确实得到了使用 PRG 模式的好处!老实说,这可能并不能直接回答我们的问题,但这是一个很好的方法。

    【讨论】:

    • 感谢您的宝贵见解。我昨天在思考这个设计,似乎只有在“更新”和“删除”操作时才会出现问题。对于这些操作,我们需要从 NHibernate 中获取对象并执行所需的操作。您描述的方法是我正在寻找的。我在问题中附加了一些疑问,请您提供您的意见。
    • 是的,哎呀,好地方,解决了混淆会话的问题。是的,实际上所有 POST 操作结果都可能会修改数据,而 GET 则不会。 PRG 模式停止重复发布,并且用户在按下 F5 时看到丑陋的“您要重新发布此表单”消息。但它也非常适合使用只读存储器。
    • 谢谢 Rippo,PRG 模式运行良好且干净。我有一个关于设计的最后一个问题,它可能不在主题范围内,但有点相关。我正在将 NHibernate 实体用于列表屏幕/其他读取操作,这些操作通过 dapper 检索数据并填充它们。但我想知道是否让这些代码针对 NHibernate 实体或者创建一个 DTO 层并使用它们。我以这种方式工作,因为它减少了应用程序中的映射。但是当我在 NHibernate 中看到这个问题时,我觉得,如果我们以后不追求它,那么应用程序就会被破坏。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2022-12-19
    • 2023-03-03
    相关资源
    最近更新 更多