2010-04-18 2 views
2

현재 Autofac-1.4.5.676, autofac contrib 및 castle DynamicProxy2를 사용하여 약간의 실험을하고 있습니다. 목표는 특정 인터페이스의 특정 메서드 호출을 가로 챌 수있는 대단위 프로파일 러를 만드는 것입니다.autofac 및 dynamicproxy2를 사용하여 선택적으로 가로 채기 방법

문제 : 선택 품목과 완전히 다른 모든 작업을 수행하고 있습니다. 내가 틀릴 수도 있지만 IProxyGenerationHook 구현을 사용하여 인터셉터와 결혼해야한다고 생각합니다. 그러나이를 수행하는 방법을 알 수는 없습니다.

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)); 

모두 ISomeSystemToMonit 또는 컨테이너에서 꺼내 진 인스턴스는 Update 메서드뿐만 아니라 모든 메서드를 가로 챌 것이라는 사실 외에도 가로 채어지고 프로파일 링됩니다.

이제 어떻게 확장하여 Update() 이외의 모든 메서드를 제외 할 수 있습니까? 앞에서 말했듯이 "ProfileInterceptor의 경우이 IProxyHookGenerator 구현을 사용하십시오."컨테이너에 알리는 방법을 이해하지 못합니다.

모두 감사합니다. 또한 지금 당장 autofac2.x로 업그레이드 할 수 없습니다. 인터셉터가 생성 될 때 CreateInterfaceProxyWithTarget 호출로 전달되어야합니다.

답변

1

IProxyGenerationHook 인스턴스가 전달되어야합니다. 자세한 내용은 this tutorial을 참조하십시오.

현재 Autofac.DynamicProxy2 통합 모듈을 변경하지 않고 이러한 후크를 제공하는 방법은없는 것 같습니다. 확장 기능 InterceptedBy에 대한 유용한 정보가 될 수 있습니다.

또는 필터링을 PerformanceInterceptor에 만들 수 있습니다. 호출이 전달 된 IInvocation을보고 Method 속성을 검사하여 프로파일 링 여부를 결정하십시오. 그러나 이것은 물론 프록시 수준에서 가로 채기를 우회하는 것보다 덜 효율적입니다.

+0

답변 해 주셔서 감사합니다. 이것은 코드 프로파일 링을위한 것이므로 가능한 한 가볍게하고 싶습니다. 따라서 요격기의 체크를 수행하고 유연성을 확인하는 성능을 확인해야합니다. –

+0

AutofacContrib.DynamicProxy2 소스를 잡고 수동으로 후크를 추가 할 수 있습니다. 그렇게하면 최소한 인터셉터에서 필터링을 통한 비교를 할 수 있습니다. –

+0

그래, 내가 그걸 줄거야 :) –

0

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));