2012-05-26 2 views
1

성 동적 프록시가 명시 적 인터페이스 구현 방식을 가로 채는 데 문제가 있습니다. 나는 이것을 할 수 있어야한다고 여기에서 http://kozmic.pl/category/dynamicproxy/을 읽었다. 내 수업은 다음과 같습니다.성 동적 프록시로 명시 적 인터페이스 구현 차단

internal interface IDomainInterface 
{ 
    string DomainMethod(); 
} 

public class DomainClass : IDomainInterface 
{ 
    string IDomainInterface.DomainMethod() 
    { 
     return "not intercepted"; 
    } 
} 

다음은 제 인터셉터 클래스입니다.

public class DomainClassInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     if (invocation.Method.Name == "DomainMethod") 
      invocation.ReturnValue = "intercepted"; 
     else 
      invocation.Proceed(); 
    } 
} 

여기 내 테스트 (실패)입니다.

[TestClass] 
    public void can_intercept_explicit_interface_implementation() 
    { 
     // Create proxy 
     var generator = new ProxyGenerator(); 
     var interceptor = new DomainClassInterceptor(); 
     var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), interceptor); 

     // Invoke proxy method 
     var result = proxy.DomainMethod(); 

     // Check method was intercepted -- fails 
     Assert.AreEqual("intercepted", result); 
    } 

명시 적 인터페이스 구현을 가로 채지 못하는 것 외에도 프록시가 아닌 구성원에 대한 알림을받지 못하는 것 같습니다. 다음은 프록시 생성 훅 (스파이로 작동)입니다.

public class DomainClassProxyGenerationHook : IProxyGenerationHook 
{ 
    public int NonProxyableCount; 

    public void MethodsInspected() {} 

    public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo) 
    { 
     NonProxyableCount++; 
    } 

    public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo) 
    { 
     return true; 
    } 
} 

여기가 내 테스트 (다시 실패)입니다.

[TestMethod] 
    public void receive_notification_of_nonproxyable_explicit_interface_implementation() 
    { 
     // Create proxy with generation hook 
     var hook = new DomainClassProxyGenerationHook(); 
     var options = new ProxyGenerationOptions(hook); 
     var generator = new ProxyGenerator(); 
     var interceptor = new DomainClassInterceptor(); 
     var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), options, interceptor); 

     // Check that non-proxyable member notification was received -- fails 
     Assert.IsTrue(hook.NonProxyableCount > 0); 
    } 

명시 적 인터페이스 구현을 가로 채기 위해 DP를 얻는 데 성공한 사람이 있습니까? 그렇다면 어떻게?

답변

4

클래스 프록시를 만듭니다. 클래스 프록시는 클래스의 가상 메소드를 가로 채기 만하고 C#의 인터페이스 메소드를 명시 적으로 구현하는 것은 가상 적이 지 않습니다 (private이기 때문에).

당신은 당신이 명시 적으로 대해 DynamicProxy 말할 필요 인터페이스의 메소드를 차단하려는 경우

사용자 인터페이스 (그래서 DynamicProxy에 대한 public 확실하게 internal로 표시됩니다 또한
var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), new Type[] { typeof(IDomainInterface) }, interceptor); 

어느 인터페이스를 공개하거나 추가 InternalsVisibleToAttribute).

첫 번째 테스트가 통과되어이 메서드가 가로 챌 것입니다.

+0

그래, 지금 내가 원한 정확하게하고있다. 감사. – knick

관련 문제