1

Spring.NET 1.3.2、NHibernate 3.1、および ASP.NET アプリケーションで OSIV パターンを使用しています。

HttpContext.Current.Items をコンストラクターの依存関係として使用するため、リクエストEventListenerスコープが必要なカスタムがあります。

ISessionリクエストスコープであるため、Spring.NET を使用してこれらの依存関係を管理できるはずです。

問題は 、 が のEventListenerように、リクエスト スコープではないIInterceptor(シングルトンである)プロパティであることです。Web オブジェクト スコープ間の不一致は問題です。ISessionFactory

次の XML スニペットを試しましたが、条件式は常に null になります。EventListenerこれは、Springがアプリケーション レベルのスコープでオブジェクトを作成したためだと思いますが、以前HttpContext.Current.Itemsはデータが取り込まれる可能性がありました。

  <object id="EventListener" scope="request" type="MyEventListener,DAL">

        <constructor-arg index="0" expression="T(System.Web.HttpContext).Current.Items.Contains('Principal')?T(System.Web.HttpContext).Current.Items['Principal']:null"/>

  </object>

だから私の要件は次のとおりです。

  1. リクエストごとにEventListener作成されるように、Spring でカスタム オブジェクトを構成する

  2. EventListenerHttpContext.Current.Items['Princpial'] がカスタム IHttpModule によって設定されるように、インスタンス化は要求ライフサイクルの十分に遅い時間に発生する必要があります。

  3. EventListenerインスタンスは現在の OSIV に挿入されますISession

4

1 に答える 1

1

あなたはこれを間違った方法でやろうとしていると思います。NHibernate のドキュメント によると、EventListeners は基本的にアプリケーションのシングルトンと見なす必要があります。

たとえば、リクエストの開始時にカスタムEventListenerを に登録SessionFactoryしても、このリスナーが現在の で発生したイベントのみを受信するという保証はありませんHttpContext

代わりに、セッション ファクトリを構成するときに、イベント ハンドラをグローバルに登録する必要があります。プリンシパルなどのコンテキスト情報が必要な場合は、(http) コンテキスト対応の実装で依存関係を注入するか、アンビエント コンテキストとして実装できます。

カスタム リスナーから、イベントを発生させたセッションにアクセスできます。たとえば、次のILoadEventListener実装を考えてみましょう。

public class CustomLoadEventListener : ILoadEventListener
{
    private IPrincipalProvider _principalProvider;

    public CustomLoadEventListener(IPrincipalProvider provider)
    {
        _principalProvider = provider;
    }

    public void OnLoad(LoadEvent @event, LoadType loadType)
    {
        var sessionThatRaisedTheEvent = @event.Session;
        var principalForTheCurrentContext = _principalProvider.GetCurrentPrincipal();
    }
}

public interface IPrincipalProvider
{
    IPrincipal GetCurrentPrincipal();
}

public class HttpContextPrincipalProvider : IPrincipalProvider
{
    public IPrincipal GetCurrentPrincipal()
    {
        return System.Web.HttpContext.Current.User;
    }
}

これはあなたが望んでいた答えではないかもしれませんが、あなたが求めているのはインフラストラクチャとの戦いであり、私は通常それを避けようとしています.

達成しようとしていることについてさらに詳細を投稿していただければ、より良い解決策を提案できるかもしれません。あなたは何をすべきEventListenerですか?

于 2012-01-20T14:11:38.160 に答える