我在寫一個使用ASP.NET MVC 2的Web應用程序,並選擇NHibernate作爲我的ORM。我基本上從觀看NHibernate系列夏季課程中學習了我的基礎知識,並採用了作者會話管理會話的每個請求策略(Ep 13)。事情似乎運作良好,但我擔心這是否是管理會話和線程安全的功能性現實世界方法。如果不是,我可以接受其他例子。Web應用程序NHibernate會話管理NHibernate風格的夏天
我已經添加了代碼來詳細說明。 這裏是我的代碼,建立了一個SessionFactory:
public class NHibernateSessionManager
{
public static readonly ISessionFactory SessionFactory;
static NHibernateSessionManager()
{
try
{
Configuration cfg = new Configuration();
if (SessionFactory != null)
throw new Exception("trying to init SessionFactory twice!");
SessionFactory = cfg.Configure().BuildSessionFactory();
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
throw new Exception("NHibernate initialization failed", ex);
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
而這正是我有web請求啓動和停止交易:
public class NHibernateSessionPerRequestModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest +=new EventHandler(Application_BeginRequest);
context.EndRequest +=new EventHandler(Application_EndRequest);
}
private void Application_BeginRequest(object sender, EventArgs e)
{
ISession session = NHibernateSessionManager.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);
}
private void Application_EndRequest(object sender, EventArgs e)
{
ISession session = CurrentSessionContext.Unbind(NHibernateSessionManager.SessionFactory);
if(session != null)
try
{
session.Transaction.Commit();
}
catch (Exception)
{
session.Transaction.Rollback();
}
finally
{
session.Close();
}
}
}
這是我會怎樣抓住從一個會話一個控制器類的我的倉庫中的一個會話工廠:
CompanyRepository _companyRepository = new CompanyRepository(NHibernateSessionManager.SessionFactory.GetCurrentSession());
所以用上面的代碼,因爲ISession是靜態的,它不是線程安全的? – mattnss 2010-10-12 14:19:47
@mattnss - 閱讀我也鏈接的答案。看起來如果你存儲會話而不是工廠本身,你可能會陷入困境。 – jfar 2010-10-12 14:42:37
所以在我的代碼ive張貼,我只存儲SessionFactory在一個靜態變量,所以它應該是線程安全的? – mattnss 2010-10-13 18:38:45