2010-12-11 45 views
1

我們要充分利用NHibernate的「工作單位」的功能。爲了在我們的C#WinForms應用程序中實現這一點,我們需要在UI層內打開一個會話,即當表單打開時。執行一些工作,然後關閉表單時關閉會話。NHibernate的 - >依賴UI層

這種基於表格的方式似乎除了一個事實,即我們現在需要從我們的UI層NHibernate的參考非常符合邏輯!我們應該在哪裏引用nHibernate,我會認爲我們可以完成thish而不必從我們的UI層中引用它?

+0

這是爲什麼不符合邏輯?工作界限的單位由用戶界面決定,所以對我來說這聽起來非常合乎邏輯。 – Paco 2010-12-11 10:56:58

+0

Paco,將UI用作UoW的邊界是合乎邏輯的,但是在UI層中引用具體的持久庫是一種代碼惡臭。用戶界面不應該知道具體實現的任何內容,它只應該關於UoW的概念。 Ryudice已經基本回答了Josata的問題。 – 2010-12-11 12:52:41

+1

如果你創建一個包裝周圍,在UI也知道實現,它知道周圍的包裝,並防止這種情況,你需要一個包裝器的包裝,等你做一些陳述沒有給予任何理由。 – Paco 2010-12-11 14:08:57

回答

2

你需要一個會話管理類,這將是結合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方法。

+0

..和ISessionManager將生活在抽象存儲庫(IRepository)旁邊,而SessionManager將與NHibernate存儲庫實現共存。不在UI層(或項目)中。 – 2010-12-11 12:54:58