我在nhibernate中使用存储库模式。 在asp.net mvc应用程序中。 我有一个httpmodule,那个:
beginRequest it calls session.beginTransaction();
EndRequest it calls session.Transaction.Commit();
95%的情况下都可以。
我有一个案例需要在一个请求中执行以下操作:
List<User> users = factory.getUsers();
// update users
// commit transaction
// load users from the db again
我应该致电:
factory.Session.Transaction.Commit();
factory.Session.BeginTransaction();
我知道这是反对使用存储库模式的原因之一,并且在HttpModule中使用Session开始/结束,但无论如何我就是这样做的:)
我有什么选择?
Uptate 的 所以我现在基本上会:
页面请求如下所示:
BeginRequest: Session.BeginTransaction();
userlist.aspx:
// code to fetch users from the db
// update users
Session.Transaction.Commit();
Session.BeginTransaction();
// code to fetch recently commited users form db
EndRequest: Session.Transaction.Commit();
以上看似乎是正确的吗?
我想在调用commit之前我还应该首先检查是否有当前事务并重新开始?
答案 0 :(得分:1)
你有两条逻辑
List<User> users = factory.getUsers();
// update users
和
load users
你想要那些在不同的交易中。所以你添加了适当的Starts和Commits。它有效,哪里有问题?
让会话开始/结束 HttpModule,但无论如何我就是这样 我在做什么:)我的选择是什么?
讨论的重点是HttpModule中是否有Session start结束?那么,你的选择是不要这样做!你有一个逻辑块(这里非常简单的逻辑)可能它是可重用的,所以把它移到自己的类。
你认为最好吗?客户代码:
useSomeLogic() // bzzzt forgot to start session
startSession()
useSomeLogic() // ok thank you, I can work, but please remember to commit
commit()
或者
useSomeLogic() // just fine, I'll start the session and do you work for you and commit
我喜欢精心打包的可重用代码,这就是为什么我会从特定于传输的模块中重构内容。