3

NHibernate の学習曲線に苦労しています。

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

Hibernate と Unit of Work パターン

UnitofWork を「会話型」ベースで採用したいと考えています。たとえば、ユーザーがフォームを開くと、UnitOfWork セッションが開き、フォームが閉じられるまでこれを開いたままにします。フォームは、ビジネス上の会話を定義するための簡単な方法です。実装に応じてこれをわずかに変更する可能性がありますが、この例では、例としてフォームの開閉を使用してください。

別のフォームの上にフォームを開くというシナリオがある場合、問題が発生します。この例では、2 つの UnitOfWork が動作している必要があります。1 つは基になるフォームに対してまだアクティブであり、新しいフォームに対しては新しい UnitOfWork です。

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

あなたの考え?

4

3 に答える 3

2

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

于 2010-12-21T03:11:18.333 に答える
0

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

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

James の回答で参照されている Ayende の記事は良いものですが、少し異なる方法で行います。独自の 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();
        }
    }

このコードは、最上位フォームが拡張する基本フォームにあります。

于 2010-12-21T18:33:03.883 に答える