2010-12-03 4 views
3

NHibernateを既存のC#WinFormsアプリケーションに移行しようとしていますが、現在セッションを管理する最良の方法を探しています。私はNHibernateだけを学んでいるので、私の知識が不足していると言い張ってください。誰かがセッション管理コードを私に提供してくれますか?私たちが見つけた実装のほとんどはWebアプリケーションです。NHibernate - セッションシングルトンC#

何か助けていただければ幸いです。

答えて

1

とデスクトップアプリケーションのための最高の記事、あなたがシングルトンを作成する必要がある1つのオブジェクトがあり、それは、ISessionFactory APIであります。これをシングルトンにする必要があるのは、接続に関する完全な設定とすべてのエンティティマッピングがメモリにロードされ、NHibernateが基になるデータストアへの格納方法と場所を知るためです。したがって、ISessionFactory APIはインスタンス化するのに非常にコストがかかります。

セッションには、ステートレスセッションとステートフルセッションのどちらが必要かを考慮する必要があります。この選択は完全にあなたのものですが、違いを知っています。

ISession APIは、添付されたエンティティのすべての変更を追跡します。アタッチされたエンティティは、NHibernateが提供する可能な方法の1つを使用して基礎となるデータストアからロードされたエンティティか、またはインスタンス化されたばかりで自分自身をセッションにアタッチした一時的なエンティティです。このようなステートフルセッションを維持すると、このAPIがメモリ内に漏れてくるようなデータ損失が発生する可能性があります。リークが発生すると、変更のトラック全体が破棄され、セッションはもはや使用できなくなります。 ISession APIは、ITransaction APIと共に常に使用されます。 ITransactionは、おそらくBegin Transactionと同じSQL(TSQL、PL/SQLなど)と同じです。データベースに永続化する必要があるたびに、エラーが変更を無効にするのを防ぐために、トランザクションを使用しながらトランザクションを実行する必要があります。 ISession APIは、作業単位の開始時にインスタンス化する必要があります。一度に複数のフォームを処理するには、1つだけISession APIインスタンスが必要な場合があります。つまり、ISession APIインスタンスをシングルトンにすることは、メモリ管理の理由から実際には悪い考えです。ISessionは、添付されたエンティティに発生したすべての変更を追跡しています。 ISession APIを長時間アライブ状態に保つと、メモリがますます使用され、メモリリークやセッションのゴミが発生します。

IStatelessSession APIは、それが何であるかを示します。ステートレスであるため、添付オブジェクトに加えられた変更を追跡しません。したがって、永続化しようとしているこのエンティティのデータベースに対するアクションとして何が行われるべきかを手動で把握しなければならないでしょう。また、IStatelessSessionは、ITransaction APIを使用して、データの整合性を処理できます。これらは両方とも、データストアに接続している間、常に互いに使用されるべきです。 IStatelessSessionは、データストアと「話す」以外の用途がないため、必要に応じて作成することが多いです。このAPIは、ステートレスなルールが最も重要なWebアプリケーションで使用されることが多いと思います。

ISessionIStatelessSesion APIの間で要件に最も適したものを選択したら、すぐに使用できます。