私はよくわかったと思います。
NHibernate.ISession を実装するラッパーを作成したので、私の方法では:
public NHibernate.ISession OpenDataSession(int userId)
{
return new SessionWrapper(SessionFactory.OpenSession(), userId, this);
}
このようにリスナーで、SessionWrapper に型キャストし、UserId プロパティを取得します。
私のラッパーも IDisposable を実装しているので、問題ないはずです。
誰かがよく知っているなら、私に知らせてください。
更新: より多くの洞察を提供するように要求されました。
SessionWrapper クラスの定義: NHibernate.ISession を実装し、すべてのメソッドを wrapedSession (コンストラクターの最初の引数) に再マップするだけです。
public DataStoreSessionWrapper(NHibernate.ISession wrappedSession, UserSession currentUser)
{
}
public NHibernate.EntityMode ActiveEntityMode
{
get { return WrappedSession.ActiveEntityMode; }
}
public NHibernate.ITransaction BeginTransaction(System.Data.IsolationLevel isolationLevel)
{
return WrappedSession.BeginTransaction(isolationLevel);
}
アイデアは、Ninject を使用して、NHibernate.ISession をこのラッパーにバインドすることです。これは、コンテナから UserSession オブジェクトにもアクセスできることを前提としていますが、UserSession は Session バッグに格納できるため、これは一種の真です。
UPDATE2(私は進化しているので:D):別の方法がありますが、それはより良いと思います。
ラッパーを使用する代わりに、私が持っているのは、基本的に UserSession オブジェクトを返す GetUserSession() という 1 つのメソッドを持つインターフェイス IUserSessionStore です。このインターフェイスは、この情報を必要とするすべてのクラスのコンストラクターにあります。
そして、Ninject を使用して、このインターフェイスを UserSessionStore_ASPNETSession というクラスにマップするだけです。このクラスは、オブジェクトを ASPNET セッション バッグに格納することでこれを実装します。
明らかに、これはすべてが単一層にある Web サイトであると想定しています (リモーティングや wcf は関係ありません)。
これは実装がよりクリーンで高速であると信じています。また、この情報を必要とする可能性のある他のすべてのレイヤーにもメリットがあります。
ありがとう!