1

私がやりたいことは、NHibernate 用に構成した Save、Update、Delete リスナーに現在のユーザー ID を含めることです。

私の意見では、この情報を ISession オブジェクトに挿入し、リスナーでこの情報を読み取るのが最善の方法です。しかし、それを行う場所はないようです。

1 つの方法はインターフェイスを実装することですが、継承できる例や基本クラスが見つかりません (ISession のメンバーが多すぎます)。実装を行うと、リスナーが型キャストしてユーザー ID を取得できることがわかります。

アプリは、Sql Server 2008 を使用した ASPNET MVC2 です。

4

3 に答える 3

0

私はよくわかったと思います。

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 は関係ありません)。

これは実装がよりクリーンで高速であると信じています。また、この情報を必要とする可能性のある他のすべてのレイヤーにもメリットがあります。

ありがとう!

于 2012-07-19T02:41:13.623 に答える
0

私は同じ問題を抱えていましたが、私の状況は異なります:

などをNHibernateSessionManager処理するISessionITransaction

次に、 でエディター エンティティを保存するために使用CallContext.SetDataし、でそれを取得するために使用します。NHibernateSessionManagerCallContext.GetDataIPreUpdateEventListenerIPreInsertEventListenerIPreDeleteEventListener

CallContext ドキュメント:

http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.callcontext.aspx

私が使用するWebコンテキストでHttpContext.Current.Items

于 2013-08-05T11:09:39.283 に答える