4

Unity を使用して、プラグ可能なアーキテクチャの型を動的に解決しています。また、インターセプトを使用して、AOP を介して ( ValidationAspectsを使用して) ビジネス ルールの検証を適用しています。最後に、NHibernate を ORM として使用してドメイン オブジェクトを保持しています。

AOP が機能するためにはVirtualMethodInterceptor、インターフェイス インターセプトが NHibernate では機能しないため、 を使用します。ISessionリポジトリ操作用のインターフェースと実際の型の間のキャストを処理するファサードがあります。

NHibernate を介してフェッチされたグラフ内のすべてのオブジェクトが AOP に対して適切にプロキシされるようにするために、NHIInterceptor実装をInstantiate()作成し、メソッドをオーバーライドしましたnew()。次にContainer.Resolve()、検証が挿入されたプロキシ化されたオブジェクトを取得し、これを NH に返して入力します。これは正常に動作します。

問題は、セッション フラッシュが発生したときに発生します。NHibernate は、グラフに表示されるオブジェクトが実際の型ではなくプロキシ型であるため、動揺します。私たちがマッピングしている方法 (すべてプロパティ経由、すべて仮想) NH は、型チェックをオーバーライドできれば、必要なすべての値をプロキシ経由で取得できるはずです。

私が知る必要があるのは、Unity によって作成され、Interception が有効になっている透過的にプロキシされたオブジェクトが与えられた場合、a) プロキシしている「実際の」インスタンスへの直接参照を取得する方法、または b) NH をオーバーライドして処理するように指示する方法はありますか?実行時に動的に、既知のマップされた型であるかのように、プロキシ型のオブジェクト?

4

1 に答える 1

0

キャッシングには傍受を使用します。したがって、クラスには、次のICallHandlerようなコードが実装されています。

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        //...
        var nextHandler = getNext();

        var realReturn = nextHandler(input, getNext);

        var cacheRefreshingItemParameters = new CacheRefreshingItemParameters
        {
            InterfaceMethod = input.MethodBase,
            InterfaceType = input.MethodBase.DeclaringType,
            TargetType = input.Target.GetType() //remember original type
        };
        _cacheProvider.Add(cacheKey, realReturn.ReturnValue, cacheRefreshingItemParameters);

        //...
        return (cachedReturn);
    }

cacheRefreshingItemParameters をキャッシュ UpdateCallback に入れ、元のサービスを解決します。

var service = _unityContainer.Resolve(parameters.TargetType);
于 2015-08-13T14:32:33.353 に答える