我计划使用“Dapper”进行检索,使用“NHibernate”进行CRUD操作。那么,遵循这种方法是一个好的设计。我最近遇到的一个问题是使用CRUD屏幕。
假设我有编辑订单表格。我正从Dapper检索实体(订单),在更新它时,我需要将这些对象附加到NHibernate会话以执行CRUD操作。它不是直接需要的,我的意思是object.delete()。
任何人都可以提供有关此设计的建议,是否有可能使其更好。它是使用asp.net mvc 3开发的Web应用程序。
对该动作的会话过滤是否意味着我们正在使用当前操作。如果是这样,对于GET操作,它应该是[DapperSession]而不是[NHSession]吗?
[NHSession]<< -------- [DapperSession] 获得行动结果
我仍在尝试了解您发布的PRG模式,如果我有任何疑问,我会发布。
由于所有这些都发生在“编辑”操作中,因此使用NHibernate获取对象也是明智之举。这样就可以节省所有这些过程,而且开销很小。
答案 0 :(得分:2)
乍一看,对于控制器上的任何POST操作方法,这对于GET和NHibernate使用Dapper(或其他其他微ORM)似乎是一个合理的选择。见伪代码): -
[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。
有关如何设置此模式的详细信息,请参阅此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模式的好处!说实话,这可能不会直接回答我们的问题,但这是一个很好的方法。