2012-01-17 57 views
2

我正在學習NHibernate,並創建了一些單元測試,並且進行得非常順利。我主要的應用程序只有兩層:我的表示層應該在NHibernate中創建會話嗎?

  1. 演示(WPF應用程序)
  2. 域(具有業務邏輯和數據訪問)

當然,我有我的單元測試項目(測試)。

我的單元測試在[TestFixtureSetup]期間調用我的SessionManager類建立SessionFactory。然後每個[Test]獲得一個Session來執行數據訪問單元測試。我想知道我應該如何在WPF項目中做到這一點。

我創建了一個簡單的對話框來查看我是否可以將我的WPF應用程序連接到我的數據庫。在我的Presentation層有一個對NHibernate的引用是錯誤的,我對這種感覺是否正確?如果是這樣,當用戶在我的表單上點擊Add來存儲對象時,我應該如何獲得會話來存儲對象?下面是我的一些代碼:

public class SessionManager 
{ 
    private ISessionFactory _sessionFactory; 

    public SessionManager() 
    { 
     _sessionFactory = GetSessionFactory(); 
    } 

    public ISession GetSession() 
    { 
     return _sessionFactory.OpenSession(); 
    } 

    private ISessionFactory GetSessionFactory() 
    { 
     return (new Configuration()).Configure().BuildSessionFactory(); 
    } 
} 

在我的測試項目中,我有這樣的事情:

[TestFixtureSetUp] 
    public void TestFixtureSetup() 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
     DatabaseFixtureSetUp(); 
     _sessionManager = new SessionManager(); 
    } 

    [SetUp] 
    public void Setup() 
    { 
     DatabaseSetUp(); 

     _session = _sessionManager.GetSession(); 
    } 

我不知道如何構建我的表現層的代碼存儲的對象。我的表單上有這個:

private void btnAddBroker_Click(object sender, RoutedEventArgs e) 
    { 
     var broker = new Broker 
     { 
      Name = txtBrokerName.Text, 
      IsActive = (bool)chkIsActive.IsChecked, 
      IsDefault = (bool)chkIsDefault.IsChecked 
     }; 

     // save the broker object to the database 
     // is it ok to have NHibernate code here? feels wrong 

    } 

你會怎麼做?

回答

2

雖然我不是來自Web開發的WPF應用程序的專家,但我會說是的它表達層生成會話確實感覺不對。

我的建議是創建一個Factory類(我看到你用SessionManager做了)負責創建一個NHibernate Session。然後,您的業務層可以調用工廠類來獲取NHibernate會話,然後在業務層中使用它來處理任何需要實現的請求。

如果您堅持IOC principles,那麼您甚至可以使用和Dependency Injection注入該工廠類和業務層。

我確定你已經知道這一點,不過我會提及它: 然而,你決定分割東西,目標是保持用戶界面操作代碼在一層,業務代碼在另一層,這樣如果您需要將此應用程序移植到Web應用程序中,則可以重用業務層,並且只需要開發表示層。

看到你已經在進行單元測試,首先編寫你的單元測試會迫使你自然地考慮分裂類的職責,使得它們是單元測試的,這是一件非常好的事情。我相信你走在正確的道路上。

+0

好的答案謝謝。因此,將NHibernate會話帶入表示層並從那裏引用NHibernate庫會很好嗎?我想知道是否我應該做一些類似'DAL.Repository.Save (經紀人);'或者什麼的,然後Repository類創建會話等。但是然後SessionFactory的創建是昂貴的......它仍然不清楚,我和我在腦海中轉圈。你知道互聯網上的任何例子,說明我想要做什麼?我發現更清晰的例子。 – 2012-01-17 22:26:11

+0

嗯..不,我會做一個獨立的程序集,叫做Business Layer。在業務層,我會創建一個名爲BrokerService的類。代理服務將具有對SessionManager的依賴性。 BrokerService可能有一個名爲AddBroker的方法,您將代理信息傳遞給該方法,然後該方法使用SessionManager創建一個Hybernate會話,用於將Broker實體對象保存到數據庫中,但我找不到示例,但我推薦閱讀DDD(域驅動設計)和IOC Inversion Of Control – 7wp 2012-01-18 21:50:29

+0

謝謝我現在已經開始閱讀Head First Design Patterns,以幫助我瞭解全局。 – 2012-01-19 17:07:12

相關問題