2012-05-26 47 views
1

我無法讓Castle Dynamic Proxy攔截顯式接口實現的方法。我在這裏閱讀http://kozmic.pl/category/dynamicproxy/,應該可以做到這一點。 這是我的課程;使用Castle動態代理攔截明確的接口實現

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#中顯式實現接口方法不是虛擬的(因爲它是私有的)。

如果你想攔截你需要明確地告訴DynamicProxy該接口上的方法,它

var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), new Type[] { typeof(IDomainInterface) }, interceptor); 

而且您的接口被標記爲internal所以請確保它的public爲DynamicProxy(要麼使接口的公共或添加InternalsVisibleToAttribute)。

由於您的第一個測試將通過,並且該方法將被攔截。

+0

是的,現在正在做我想要的東西。謝謝。 – knick

相關問題