2012-01-17 17 views
2

私はNHibernateを学んでおり、いくつかの単体テストを作成しています。ドメイン(ビジネスロジックとデータアクセスを持っている) プレゼンテーションレイヤはNHibernateでセッションを作成する必要がありますか?

  1. プレゼンテーション(WPFアプリ)
  2. もちろん、私は私のユニットテストプロジェクト(テスト)を持っている:私のメインアプリは唯一の2つの層を有しています。

    私の単体テストはクラスを呼び出して、[TestFixtureSetup]の間にSessionFactoryを構築します。各[Test]Sessionとなり、データアクセスユニットテストが実行されます。 WPFプロジェクトでこれをどうやってやるべきだろうと思っています。

    単純なダイアログボックスを作成して、自分のWPFアプリケーションをデータベースに接続できるかどうかを確認しました。プレゼンテーションレイヤーで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アプリケーションの専門家ではありませんが、私はそう言うでしょう。プレゼンテーションレイヤーがセッションを生成するのは間違っています。

NHibernateセッションの作成を担当するFactoryクラス(SessionManagerで確認したもの)を作成することをお勧めします。あなたのビジネスレイヤは、ファクトリクラスを呼び出してNHibernateセッションを取得し、それをビジネスレイヤで使用して、実行する必要のある要求を処理します。

IOC principlesに固執している場合は、Dependency Injectionを使用して、そのファクトリクラスとビジネスレイヤーを挿入することもできます。 あなたは物事を分割することに決めましたが、目的は1つのレイヤー内のユーザーインターフェイス操作コードと別のレイヤー内のビジネスコードを保持することですこのアプリケーションをWebアプリケーションに移植する必要がある場合は、ビジネスレイヤーを再利用でき、プレゼンテーションレイヤーのみを開発する必要があります。

ユニットテストをすでに行っているのを見て、ユニットテストを最初に書くと、ユニットテスト可能なようにクラスの責任分担を自然に考えるようになります。それはとても良いことです。私はあなたが正しい道にいると信じています。

+0

すてきな回答ありがとうございます。ですから、NHibernateセッションをプレゼンテーション層に持ってきてそこからNHibernateライブラリを参照するのはいいですか?私はDAL.Repository.Save (ブローカー)のような何かをすべきかどうか疑問に思っていました;あるいは何か、そしてリポジトリクラスがセッションを作成するなどします。しかし、SessionFactoryの作成は高価です...それは私にとってはまだ分かりません。私は私の頭の中で円で回っています。インターネット上で私が何をしようとしているかを説明する例を知っていますか?私ははるかに明確な例を見つける。 –

+0

さて、いいえ、私はビジネスレイヤーのような別のアセンブリを作るでしょう。ビジネス層では、たとえばBrokerServiceのようなクラスを作成します。ブローカサービスはSessionManagerに依存します。 BrokerServiceには、ブローカ情報を渡すAddBrokerというメソッドがあり、このメソッドはSessionManagerを使用してBrokerエンティティオブジェクトをデータベースに保持するためのHybernateセッションを作成しますが、例は見つかりませんがDDD(ドメイン駆動型デザイン)とIOC Inversion of Controlについて読むことをお勧めします – 7wp

+0

ありがとうございました。私は今、大きな絵を見るのを手助けするためにヘッドファーストデザインパターンを読み始めました。 –

関連する問題