2009-06-11 5 views

答えて

5

すでにNHibernateので提供されて記述されている作業単位のようなユニットを行うには理由がないので、作業。

私たちがWCFサービスで持っているものは、現在の作業単位のために私たちのアプリケーションで重要な情報を含む上位レベルの作業単位です。これには、NHibernateのSessionを抽象化することが含まれます。あなたがそれを分解すると、3つのカテゴリに適合するコードがあります。

  1. Unit Of Workを処理するコードです。作業単位を後押ししている人は関係ありません。これは、NHibernate、iBatis、またはカスタムORMである可能性があります。すべてのコードは、読み込み、ロールバック、保存などを行う必要があります。これには、使用されたメカニズムについても気にする必要はありません。

  2. NHibernate固有のことを行うため、ISessionを直接処理する必要があるコード。通常、これは作成する必要がある複雑なクエリと関連しています。

  3. ユニットが作業単位で実行されているか、またはセッションにアクセスしているかを知る必要はありません。私たちはこの議論の一部としてこれを完全に無視することができます。

1のコードは、ちょうど私が直接制御していないコードや変更可能なものを抽象化しようとしています。これには2つの理由から価値があります。

  • 開始時に、私たちはNHibernateで100%販売されていませんでした。私たちはiBatisや何かカスタムを検討していました。明らかにこれはもはや問題ではない。

  • チーム全体がNHibernateのエキスパートではなく、私たちもそれを望んでいません。ほとんどの人にとって、カテゴリ1に適合するコードを書いています。彼らが知っていることはすべて、ユニットオブワークです。カテゴリ2のコードを書かなければならないときは、NHibernateをよく理解しているチームの人々によって書かれています。

だから私はあなたが話している作業単位の種類は、私は仕事のより高いレベルのユニットは、値の多くを提供できることを示唆している必要はありませんと言うでしょう閉じます。 を初期化 - - をコミット - 私は両方のセッションおよびトランザクション管理のためにそれを使用するIDisposable.Dispose

- ロールバック

+0

ShaneC、私も同様の質問があります。私のニーズに合った作業単位を作成したようです。あなたは私の質問を見て、あなたの$ 0.02を提供できますか? http://stackoverflow.com/questions/2604762/using-unit-of-work-design-pattern-nhibernate-sessions-in-an-mvvm-wpf – Echiban

0

すべてのマッピングを正しく設定すると(カスケード)、特別な操作を行う必要はなく、ISessionはうまくいくでしょう。ただし、3層アプリケーションを作成する場合は、1回のトランザクションで実行するデータベース操作を手動で順序付けする必要があります。 「エンタープライズアプリケーションアーキテクチャのパターン」でファウラーの「リファレンス実装では、」良い出発点になります

class UnitOfWork... 

    public void registerNew(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
     Assert.isTrue("object not dirty", !dirtyObjects.contains(obj)); 
     Assert.isTrue("object not removed", !removedObjects.contains(obj)); 
     Assert.isTrue("object not already registered new", !newObjects.contains(obj)); 
     newObjects.add(obj); 
    } 
    public void registerDirty(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
     Assert.isTrue("object not removed", !removedObjects.contains(obj)); 
     if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) { 
     dirtyObjects.add(obj); 
     } 
    } 
    public void registerRemoved(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
     if (newObjects.remove(obj)) return; 
     dirtyObjects.remove(obj); 
     if (!removedObjects.contains(obj)) { 
     removedObjects.add(obj); 
     } 
    } 
    public void registerClean(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
    } 
+0

3層アプリケーションです。しかし、我々は、各ユーザーの要求をアトミックにしたいので、1ユーザー要求= 1 DBトランザクション。私は、ユーザーの要求を処理し、ドメインオブジェクトを変更し、私の集約ルートを維持するためにNHibernateに依頼します。 – ng5000

+0

これはidentitymapに対する抽象です。これは、FowlerのPOEAで説明されているように、しかしNHibernateで説明されているように、手動でdatamappingを作成するときに便利です。これは、identitymapがISessionに組み込まれているためです。 – Paco

1

作業インターフェイスの私の基本的な単位は、以下の方法 が含まれています。 これは、異なるセッションスコープに対して何度もコードを書く必要がないので便利です。(1リクエストあたりの作業単位、1リクエストあたりのスレッド数、1スレッドあたり)

+0

例を投稿できますか? –

+0

どのような例ですか?作業単位または作業単位自体を使用していますか? – Paco

+0

さまざまなセッションスコープをどのように扱ったのですか? –

関連する問題