2009-12-18 75 views
0

我在使用nhibernate中的存储库模式。 在一个asp.net mvc应用程序中。 我有一个HTTP模块,即:如何在单个请求中提交并启动新的事务?

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会话开始/结束,但无论如何,这就是我是如何做到这一点:)

什么是我的o ptions?

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之前先检查一下是否有当前事务并重新开始?

回答

1

你有逻辑

List<User> users = factory.getUsers(); 

// update users 

load users 

的两件,你想那些在单独的交易。所以你添加适当的开始和提交。它有效,问题在哪里?有

在 的HttpModule会话开始/结束,但无论如何,这就是我 我做吧:)有什么选择?

讨论的重点是否让Session开始在HttpModule中结束?那么,你的选择是不做的!你有一个逻辑块(在这里非常简单的逻辑),可能它是可重用的,所以把它移到它自己的类中。你认为这是最好有

客户端代码:

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 

我喜欢漂亮包装的可重复使用的代码,这就是为什么我重构的东西远离特定的传输模块。

相关问题