2009-08-14 74 views
0

我正在構建一個web應用程序,並且每當我進行數據庫調用時,我都需要一個會話。nhibernate和會話,請澄清

我知道創建會話對象非常昂貴。

我在這裏以下存儲庫模式:http://web.archive.org/web/20110503184234/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx

他使用一種叫做的UnitOfWork獲取會話。

對於Web應用程序,我不應該將Session存儲在Request.Items集合中嗎?所以每個請求只創建一次?

我真的需要UofW嗎?

回答

0

在NHibernate的情況下,關鍵類是SessionFactory,SessionProvider正在幫你照顧(如果你這樣實現的話)。保持SessionFactory存活,併爲您處理會話。

我似乎也有人將SessionFactory保存在他們的IoC中。

2

會話是工作單元 - 它基本上用於存儲更改,直到將它們刷新到db。在啓動時保存靜態會話工廠,並使用它爲每個Web請求創建一個會話 - Request.Items似乎是放置會話的有效位置。

存儲庫模式是對工作單元的包裝。存儲庫模式與UoW模式的不同之處在於,repo.Save(obj)應該立即將obj保存到數據庫,而UoW將等待刷新。

我的建議是要跳過庫模式,直接使用的Isession(見http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx

+0

我想使用存儲庫模式,因爲它給了我所有的實體無w/o 0代碼寫入的基本問題,怎麼會這麼糟糕?!:) – mrblah 2009-08-16 01:52:02

+1

ISession接口已經給你基本的CRUD(.Get ( ),.Load ,.Delete,.SaveOrUpdate)和使用HQL,標準API或NHibernate.Linq進行復雜查詢。 – mcintyre321 2009-08-16 12:56:30

+0

另請參閱http://ayende.com/Blog/archive/2009/08/05/do-you-need-a-framework.aspx – mcintyre321 2009-08-16 12:57:45

0

使用此來管理您的會話:

HybridSessionBuilder

它管理,讓您訪問在整個應用程序中使用的單個會話。