雖然公司標準是使用NHibernate(因爲這是所有項目的標準),我正在編寫一個新的應用程序,而我正在使用ASP.NET MVC因爲它現在已經成熟了。我實現了我的交易中的控制器(據稱是你應該做的方式),所以它看起來像這樣在我的根控制器:NHibernate會話+事務使用ASP.NET MVC 3
[TransactionPerRequest]
public class FbsController : Controller
{
}
然後我所有的控制器從這個FbsController
繼承。這樣做的原因是因爲我的所有動作中有90%會轉移到數據庫,所以創建一個事務併爲其餘10%的動作(很少執行)處置它的開銷並不值得用[TransactionPerRequest]
裝飾每個動作。
總是難倒我的事情是關於NHibernate會話。在沿東西我都行庫類這一點,雖然這是在其他項目不同:
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();
}
}
所以後來在我的庫中的大部分功能,我不得不打開會話。有什麼辦法可以避免這種行爲,所以我不必在每個存儲庫方法中打開一個會話?這似乎有點反直覺,因爲我通常必須爲每一個人做。我想知道其他人的解決方案對於我看到的以多種方式圍繞代碼散亂的交易&問題。
現實我希望我的存儲庫的方法如下所示:
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();
}
隨着一切正在處理含蓄。
這沒問題,但如果您使用存儲庫模式並需要訪問存儲庫中的會話,該怎麼辦?他沒有提到,該會話僅在控制器中可用,因此使用QueryOver向數據庫發出的請求需要從控制器完成。 – Kezzer 2011-05-06 09:04:36
@Kezzer,你可以在'HttpContext.Current.Items [「NHibernateSession」]周圍編寫一個包裝類,然後配置你的DI框架把它傳遞給你的倉庫構造函數。 – 2011-05-06 09:08:21
非常好的鏈接,這正是我正在尋找的。謝謝! – Tx3 2011-11-13 11:06:04