我目前正在编写一个新应用程序,尽管公司标准是使用 NHibernate(因为这是所有项目的标准),但由于 ASP.NET MVC 3 现在已经成熟,所以我正在使用它。我已经在 Controller 中实现了我的事务(这应该是你应该这样做的方式),所以它在我的根 Controller 中看起来像这样:
[TransactionPerRequest]
public class FbsController : Controller
{
}
然后我的所有 Controller 都继承自这个FbsController
。这样做的原因是因为我所有操作的 90% 都会发送到数据库,因此创建事务并为剩余 10% 的操作(很少会执行)处理它的开销是不值得的使用 [TransactionPerRequest]
装饰每个操作。
一直困扰我的是 NHibernate session 。在存储库中,这与我拥有的东西类似,尽管这在其他项目中有所不同:
public void Add(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
session.Save(user);
}
}
public void Remove(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
session.Delete(user);
}
}
public User GetById(int userId)
{
using (ISession session = NHibernateHelper.OpenSession())
{
return session.QueryOver<User>()
.Where(c => c.UserID == userId)
.SingleOrDefault();
}
}
因此,对于我的存储库中的大多数功能,我必须打开一个 session 。有什么方法可以避免这种行为,这样我就不必在每个存储库方法中打开 session ?这似乎有点违反直觉,因为我通常必须为每一个都这样做。我想知道其他人对交易和 session 问题的解决方案是什么,我看到代码中以各种方式散布着这个问题。
实际上,我希望我的存储库方法如下所示:
public void Add(User user)
{
session.Save(user);
}
public void Remove(User user)
{
session.Delete(user);
}
public User GetById(int userId)
{
return session.QueryOver<User>()
.Where(c => c.UserID == userId)
.SingleOrDefault();
}
一切都被隐式处理。
最佳答案
您可以查看 Ayende Rahien 的以下系列博客文章:
- Refactoring toward frictionless & odorless code: The baseline
- Refactoring toward frictionless & odorless code: Hiding global state
- Refactoring toward frictionless & odorless code: Limiting session scope
- Refactoring toward frictionless & odorless code: A broken home (controller)
- Refactoring toward frictionless & odorless code: The case for the view model
- Refactoring toward frictionless & odorless code: Getting rid of globals
- Refactoring toward frictionless & odorless code: What about transactions?
关于使用 ASP.NET MVC 3 的 NHibernate session + 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5908737/