我們要充分利用NHibernate的「工作單位」的功能。爲了在我們的C#WinForms應用程序中實現這一點,我們需要在UI層內打開一個會話,即當表單打開時。執行一些工作,然後關閉表單時關閉會話。NHibernate的 - >依賴UI層
這種基於表格的方式似乎除了一個事實,即我們現在需要從我們的UI層NHibernate的參考非常符合邏輯!我們應該在哪裏引用nHibernate,我會認爲我們可以完成thish而不必從我們的UI層中引用它?
我們要充分利用NHibernate的「工作單位」的功能。爲了在我們的C#WinForms應用程序中實現這一點,我們需要在UI層內打開一個會話,即當表單打開時。執行一些工作,然後關閉表單時關閉會話。NHibernate的 - >依賴UI層
這種基於表格的方式似乎除了一個事實,即我們現在需要從我們的UI層NHibernate的參考非常符合邏輯!我們應該在哪裏引用nHibernate,我會認爲我們可以完成thish而不必從我們的UI層中引用它?
你需要一個會話管理類,這將是結合NHibernate會話的包裝。像這樣:
public class SessionManager : ISessionManager
{
private readonly ISessionFactory _sessionFactory;
SessionManager()
{
_sessionFactory = CreateSessionFactory();
}
public void OpenSession()
{
ISession session = _sessionFactory.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);
}
public void CloseSession()
{
ISession session = CurrentSessionContext.Unbind(_sessionFactory);
if (session == null) return;
try
{
session.Transaction.Commit();
}
catch (Exception)
{
session.Transaction.Rollback();
}
finally
{
session.Close();
session.Dispose();
}
}
}
只需創建CreateSessionFactory方法。
..和ISessionManager將生活在抽象存儲庫(IRepository)旁邊,而SessionManager將與NHibernate存儲庫實現共存。不在UI層(或項目)中。 – 2010-12-11 12:54:58
這是爲什麼不符合邏輯?工作界限的單位由用戶界面決定,所以對我來說這聽起來非常合乎邏輯。 – Paco 2010-12-11 10:56:58
Paco,將UI用作UoW的邊界是合乎邏輯的,但是在UI層中引用具體的持久庫是一種代碼惡臭。用戶界面不應該知道具體實現的任何內容,它只應該關於UoW的概念。 Ryudice已經基本回答了Josata的問題。 – 2010-12-11 12:52:41
如果你創建一個包裝周圍,在UI也知道實現,它知道周圍的包裝,並防止這種情況,你需要一個包裝器的包裝,等你做一些陳述沒有給予任何理由。 – Paco 2010-12-11 14:08:57