3

最初の NHibernate プロジェクトは順調に進んでいます。ただし、シナリオでセッションとオブジェクトを管理する方法の全体像はまだ把握していません。

そのため、NHibernate を使用してデータベースに格納された永続オブジェクト モデルでシステム構造を構成しています。

システムは、アプリケーションがサービス プロセスで監視している物理デバイスで構成されます。そのため、サービスの起動時に、サービスで Device オブジェクトをインスタンス化し、デバイス インターフェイスから読み取ったデータに従ってステータスを更新します。オブジェクト モデルは、サービスの有効期間中存続します。

このサービスは、オブジェクト データを表示し、一部のオブジェクトを操作することもできる Silverlight クライアントにもサービスを提供しています。ただし、サービスが監視に使用しているのと同じオブジェクトにアクセスする必要があります。たとえば、オブジェクトには永続化されていないメモリ内データも含まれているためです。(はい、実際にデータをクライアントに転送するために DTO オブジェクトを使用しています。)

このサービスはマルチスレッド システムであるため、問題は NHibernate セッションをどのように管理するかです。

私は現在、NHibernate セッションに直接アクセスする代わりに、バックグラウンドでオブジェクトの永続性を処理するバックグラウンド スレッドを用意し、他のスレッドは "SaveRequests" をリポジトリに配置するというアプローチを検討しています。これにより、サービスに単一のセッションを使用して、オブジェクトにアクセスするサービスおよびクライアントから完全に分離された NHibernate レイヤーを管理できます。

誰もがリクエストごとのセッションモデルまたはいくつかのバリエーションを提案しているため、そのようなセットアップに関するドキュメントは見つかりませんでした。しかし、あるセッションでオブジェクトをインスタンス化して別のセッションに保存すると、それは同じオブジェクトではなく、NHibernate がデータベースに新しいエントリを作成するようにも見えます。

また、このようなコンテキストでの IOC コンテナの役割を理解しようとしましたが、実際に役立つことを示す有用な例は見つかりませんでした。

私は正しい軌道に乗っていますか、それともどのように進めるべきですか?

4

1 に答える 1

2

ISession を作業単位と考えてください。アプリケーションのコンテキスト内で、作業単位を構成するものを定義する必要があります。作業単位は、完全で機能的なタスクを構成する一連の小さな操作の境界です (完全で機能的なタスクは、アプリケーションの設計で定義されます)。サービスが Silverlight クライアント リクエストまたはその他の外部リクエストに応答するときですか? タイマーで何らかの作業を行うためにサービスが起動したときですか? 上記のすべて?

その作業単位に対してセッションを作成し、完了時に破棄する必要があります。実行時間の長い ISession インスタンスを使用することはお勧めしません。この場合、オペレーションは、見つけられるあらゆるアンビエント ISession を遅延して使用します。

この考え方は、一般的に次のように説明されています。

  1. いくつかの作業を行う必要があります (イベントに応答しているため、それが着信要求であろうと、タイマーのジョブであろうと、問題ではありません)。
  2. そのため、新しい作業単位を開始する必要があります (これは、この作業を実行するときに必要なすべての操作を追跡するのに役立ちます)。
  3. 作業単位は、私の作業を追跡するために新しい ISession を開始します。
  4. 私は自分の仕事をします。
  5. ジョブを正常に実行できた場合は、すべての変更をフラッシュしてコミットする必要があります
    1. そうでない場合は、すべての変更を元に戻します。
  6. 自分の後にクリーンアップします(ISessionを破棄するなど)。
于 2012-05-10T08:21:30.043 に答える