2

私は現在、Autofac-1.4.5.676、autofac contrib、およびCastleDynamicProxy2を使用して少し実験を行っています。目標は、特定のインターフェイスの特定のメソッド への呼び出しをインターセプトできる粗粒度のプロファイラーを作成することです。

問題:選択部分を除いて、すべてが完全に機能しています。私は間違っている可能性がありますが、インターセプターをIProxyGenerationHook実装と組み合わせる必要があると思いますが、これを行う方法がわかりません。

私のコードは次のようになります。

インターセプトおよびプロファイリングされるインターフェース( Update()メソッドのプロファイリングのみに関心があることに注意してください)

public interface ISomeSystemToMonitor
{
    void Update(); // this is the one I want to profile
    void SomeOtherMethodWeDontCareAboutProfiling();
}

これで、システムをコンテナーに登録するときに、次のことを行います。

// Register interceptor gubbins
builder.RegisterModule(new FlexibleInterceptionModule());
builder.Register<PerformanceInterceptor>();

// Register systems (just one in this example)
builder.Register<AudioSystem>()
.As<ISomeSystemToMonitor>)
.InterceptedBy(typeof(PerformanceInterceptor)); 

コンテナーから引き出されたすべてのISomeSystemToMonitorインスタンスは、Updateメソッドだけでなく、すべてのメソッドをインターセプトするという事実を除いて、必要に応じてインターセプトおよびプロファイリングされます。

では、これを拡張してUpdate()以外のすべてのメソッドを除外するにはどうすればよいですか?私が言ったように、「ProfileInterceptorには、このIProxyHookGeneratorの実装を使用する」ことをコンテナーに通知する方法がわかりません。

すべての助けに感謝します、乾杯!また、現在autofac2.xにアップグレードできないことに注意してください。私は1で立ち往生しています。

4

2 に答える 2

2

インターセプターが生成されるときに、インスタンスを呼び出しに渡すIProxyGenerationHook必要があります。CreateInterfaceProxyWithTarget詳細については、このチュートリアルを参照してください。

現在、Autofac.DynamicProxy2統合モジュールを変更せずにそのようなフックを提供する方法はないようです。InterceptedBy拡張機能への素晴らしい追加かもしれません。

または、フィルタリングをに組み込むこともできますPerformanceInterceptorIInvocation呼び出しが渡されたことを確認し、プロパティを調べてMethodプロファイルを作成するかどうかを決定します。ただし、これはもちろん、プロキシレベルで傍受をバイパスするよりも効率的ではありません。

于 2010-04-19T08:32:42.543 に答える
2

DynamicProxy2の場合、EnableInterfaceInterceptorsメソッドにProxyGenerationOptionsオブジェクトを受け取るオーバーロードが含まれるようになりました。

//Define the builder
var builder = new ContainerBuilder();

//Instantiate your Proxy options with a selector
var proxyOptions = new ProxyGenerationOptions {Selector = new MyInterceptSelector()};

//Pass the proxy options as a parameter to the EnableInterfaceInterceptors method
builder.RegisterType<MyRepo>()
            .As<IMyRepo>()
            .EnableInterfaceInterceptors(proxyOptions)
            .InterceptedBy(typeof(IInterceptor));
于 2016-07-22T18:11:52.487 に答える