3

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

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

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


关于回复的问题:

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

    [NHSession] <<--------[DapperSession] 获取操作结果

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

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

4

1 回答 1

2

乍一看,这似乎是一个合乎逻辑的选择,将 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 控制器只能访问 NHSessions。

有关如何设置此模式的详细信息,请参阅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 模式的好处!老实说,这可能并不能直接回答我们的问题,但这是一个很好的方法。

于 2012-08-26T09:46:28.743 回答