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 にバインドしない「セッション」を管理する抽象的な方法はありますか?