WCFアプリケーションにリクエストごとのセッションモデルを実装しようとしています。このトピックに関する無数のドキュメントを読みましたが、これの完全なデモンストレーションがないようです。私は実際にこのようないくつかの非常に有用な記事に出くわしました:
NHibernateのISession、単一のWCF呼び出しを対象
しかし、これらはすべてNHibernateとNinjectにWCF固有の実装がなかった昔のものであり、カスタムサービスプロバイダーなどを実装することで私が必要とするものを達成しました。NinjectとNHibernateの両方が現在WCFをサポートしているので、一貫性を保ちたいと思います。それらのモジュールを使用することによって、しかし私はここに行き着きました...
基本的なセットアップとフローは次のようになります。
- nhibernate構成でCurrentSessionContextをWcfOperationSessionContextに設定します
- サービスの開始時、リクエストの開始時、または初期化時間の前後の任意の場所で、セッションを開き、現在のコンテキストにバインドします
- リポジトリは、SessionFactory.GetCurrentSession()メソッドを使用して現在のセッションインスタンスを取得します
- ライフサイクルの最後にセッションのバインドを解除して閉じます
私の最初の問題は、バインディングを処理するためにwcfライフサイクルにアクセスできなかったことでした。ninjectコードを少し掘り下げた後、あまり変更せずにServiceHostのOpening / Closingイベントにメソッドをフックすることができましたが、スレッド静的であるため、OperationContextにアクセスできませんでした。
後で、asp.net互換性を有効にして、Application_BeginRequestとApplication_EndRequestを使用しようとしましたが、非常に有望に見えましたが、httpリクエストではなく、サービスインスタンスにバインドする必要があるため、これが最善の解決策ではないと思います。
ninjectの組み込みのwcf拡張ライブラリを使用してこれを達成した人はいますか?または私が間違っているかもしれないことについてのアイデアはありますか?