1

NHibernate のセッション管理に関する同様の質問を数多く見てきましたが (私だけではないことはわかっています)、セッション管理の詳細を他のレイヤーから抽象化することに対処する回答はありません。

簡単に言えば、Customer、Product、Order などのオブジェクトを持つ Domain レイヤーがあります。Get<Product>(int id) または Get<Customer>(int id) や Get<Order>(int id) などのメソッドを含む IOrderEntryService のようなアプリケーションのサービスを定義する統合レイヤーがあります。これらのサービスを使用して顧客、注文などを取得するビジネス ルール レイヤーがあります。ビジネス ルールはサービス インターフェイスのみを使用して、特定のサービス実装への強い依存を回避します。

NHibernate を使用して IOrderEntryService を実装し、マッピングを定義して Customer.Orders や Order.Customer などのプロパティをサポートし、遅延読み込みを使用して同様の関連付けを行うことができます。Get<Customer>(int id) の実装では、ISession オブジェクトを開き、Customer を取得してから、ISession を破棄します。後で Customer.Orders を参照すると、現在のセッションがないため、例外が発生します。この理由は理解できますが、より高いレイヤーを NHibernate にバインドしない回避策を見つけるのに苦労しています。私が見つけたすべての例は、リクエストごとに NHibernate.ISession を取得する方法を提案しているため、リクエストの有効期間全体にわたってセッションが開いたままになります。これには苦労しています。これは、より高いレイヤーを NHibernate ISession オブジェクトにバインドするためです。

上位層を NHibernate にバインドしない「セッション」を管理する抽象的な方法はありますか?

4

2 に答える 2

1

Spring.Net のような「暗黙的な方法」でトランザクションを管理できるフレームワークを使用することをお勧めします。

「オープン」、「クローズ」、「コミット」、または「ロールバック」「ISession's」/「トランザクション」を行うセッションを管理します。

あなたの質問について: 上位層の ISession に対する管理の一部を行わずに、(プレゼンテーションのレンダリング中に) セッションを開いたままにする方法はないと思います。

[ITransaction の管理] がそれらから除外されていれば、上位層で ISession の管理を維持することに問題はありません。

[Transaction]「Spring.Net」を使用すると、次を使用して、お気に入りのレイヤーで「ITransaction の管理」を実行できます[Transaction(ReadOnly = true)]

于 2012-09-11T23:47:55.037 に答える
1

シャープ アーキテクチャとシャープアーキテクチャ ライトプロジェクトを確認してください。どちらも、Web ベースのシステムで nhibernate を使用する方法をしっかりと理解しています。さらに、IoC コンテナー、DDD、TDD などの他のアプローチの背景を提供します。

于 2012-09-12T06:53:58.773 に答える