3

UnityはAoP機能を実現するために2つの異なるルートを提供しているようです。

問題はなぜですか?違いは何ですか?各アプローチの長所と短所は何でしょうか?

たとえば、ICallHandlerを使用します。

unity.Configure<Interception>()
.AddMatchingRule(
                    new TypeMatchingRule(typeof (ComplexEntity))
                ).AddMatchingRule(
                    new TypeMatchingRule(typeof (ComplexEntity.InnerEntity))
                ).AddMatchingRule(
                    new MemberNameMatchingRule("*")
                ).AddCallHandler(
                    new CallHandler()
                );

ただし、ICallHandlerの代わりにIInterceptionBehaviorを使用して、同様の機能を実現することもできます。

unity.RegisterType<ComplexEntity,ComplexEntity>
     (new VirtualMethodInterceptor(), new InterceptionBehavior)

インターセプトを設定できるが、コールハンドラーを使用するハイブリッドもどこかにあります。

unity.Configure<Interception>()
                .SetInterceptorFor<ComplexEntity>(new VirtualMethodInterceptor())
                .AddPolicy("TestPolicy")
                .AddMatchingRule(
                    new TypeMatchingRule(typeof (ComplexEntity))
                ).AddMatchingRule(
                    new TypeMatchingRule(typeof (ComplexEntity.InnerEntity))
                ).AddMatchingRule(
                    new MemberNameMatchingRule("*")
                ).AddCallHandler(
                    new CallHandler()
                );

では、どちらを使用しますか?単一のフレームワークに一見冗長なソリューションがあるのはなぜですか?

4

2 に答える 2

7

答えは主に歴史的なものです。Unityが存在する前に、EnterpriseLibrary3.0ではポリシーインジェクションが最初に登場しました。物事を接続するためのコンテナや中心点がなかったため、すべての一致するルールのものが必要でした。

インターセプトをUnityに統合する作業を開始したとき、これは物事を単純化する機会を与えてくれました。ポリシーインジェクションブロックの経験は、多くの人にとってPIABの経験がやり過ぎであることを示していました。

ただし、PIABを使用してすべての人を恣意的に壊したくなかったので(すでに数回行っています)、新しいシンプルなインターフェイスを維持し、古いインターフェイスも実装しました。

于 2013-03-08T18:16:23.013 に答える
5

私が十分に注意深く見ていなかったことを気にしないでください。

独自のInterceptionBehaviorを作成できますが、これはクラスにのみ適用されます。または、PolicyInjectionBehaviorが提供するライブラリを使用して、ICallHandlerとポリシーを使用することもできます。

したがって、違いは、単純なデリゲートとマルチキャストデリゲートのようになります。ポリシーインジェクションを使用すると、コンテナ全体のクエリ(マルチキャスト)を使用してポイントカットを定義し、クエリに一致する複数のタイプにアドバイスを適用できますが、IInterceptionBehaviorを使用すると、特定のタイプのみに特定のアドバイスを適用できます(シングルキャスト)。

PolicyBehaviorは、マルチキャスト機能を提供するIInterceptionBehaviorの実装です。

于 2013-03-06T09:19:23.860 に答える