2010-12-21 9 views
3

NHibernateの学習曲線に苦労しています。NHibernate作業単位 - 複数のセッション(WinForms)

私たちは現在、NHibernateを使用するようにC#Winformsアプリケーションを移植しており、Gabriel Schenkerの詳細でUnit Of Work(UnitOfWork)を採用しています。

http://nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx

私たちは、 "会話" に基づいたUnitOfWorkを採用したいです。たとえば、ユーザーがフォームを開くと、UnitOfWorkセッションを開き、フォームが閉じられるまでこれを開いたままにします。フォームはビジネス会話を定義する簡単な方法ですが、実装によっては若干変更することがありますが、この例では例としてフォームの開閉を使用してください。

フォームのシナリオを別のフォームの上に開いたときに問題が発生します。この例では、2つのUnitOfWorkを操作する必要があります。 1つは依然として基底のフォームでアクティブであり、新しいUnitOfWorkは新しいフォームで使用されます。

これはどのように実装しますか? Gabrielによって提供されるUnitOfWork機能は、UnitOfWorkごとに1つのセッションのみを許可しますか?私の最初の考えは、セッションを任意のフォームまたはアプリケーションの一部から呼び出すことができるように、セッションを辞書に格納することです。

あなたの考えは?

答えて

2

アイドルがMSDNマガジンでNHibernateを使用してデスクトップTo-Doアプリケーションを構築しています:http://msdn.microsoft.com/en-us/magazine/ee819139.aspxを読んでください。彼は、シッククライアントアプリケーション内で複数の作業単位を管理する方法について説明します。

0

2番目のフォームが、詳細を編集するためのモーダルフォームのような子フォームである場合、親と同じUOWに参加していて、UOWを親から子に渡す必要があります。コンストラクタ

私はGabriel Schenkerの記事のアプローチのファンではありません。 ISessionをUOW実装として直接使用する方がよいと思います。

アヤンデの記事はジェームスの答えでいいですが、少し違っています。自分のUOWを制御するトップレベルのフォームのために、我々は、フォームのコンストラクタで呼び出されるISessionを作成するには、Program.csの中の静的メソッドを持っています。

private readonly ISession _session; 

public frmPlayerViewer() 
{ 
    InitializeComponent(); 
    // bail out if we're in the designer 
    if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
    { 
      return; 
    } 
    _session = Program.OpenEvtSession(FlushMode.Commit); 
} 

ISessionが適切に配置されていることを確認するには、OnFormClosing上書き:

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     base.OnFormClosing(e); 
     if (!e.Cancel && _session != null) 
     { 
      if (_session.Transaction.IsActive) 
      { 
       const string msg = "OnFormClosing with active transaction."; 
       log.Error(msg); 
       throw new Exception(msg); 
      } 
      _session.Dispose(); 
     } 
    } 

このコードは基本形式であり、最上位フォームが拡張されたフォームです。

関連する問題