Castle.DynamicProxy:无接口类用CreateClassProxyWithTarget拦截器不生效
解决Castle.DynamicProxy拦截无接口类失效的问题
问题根源
Castle.DynamicProxy实现类代理的核心逻辑是生成目标类的子类,通过重写方法注入拦截逻辑。如果目标类的方法没有用virtual修饰,子类无法重写该方法,拦截器的代码自然不会被触发。你的SampleClass中Method1和Method2都是非virtual方法,所以不管用CreateClassProxy还是CreateClassProxyWithTarget都无法生效。
可行解决方案
方案1:给目标方法添加virtual修饰符
直接修改遗留类的方法,加上virtual关键字,让代理子类能重写方法触发拦截:
public class SampleClass : ISampleClass { public virtual void Method1() { Console.WriteLine("Executing Method 1..."); } public virtual void Method2() { Console.WriteLine("Executing Method 2..."); } }
之后两种类代理方式都能正常工作:
// 直接创建类代理实例 var sampleClass = generator.CreateClassProxy<SampleClass>(interceptor); // 基于已有实例创建代理 var sampleClass = generator.CreateClassProxyWithTarget(new SampleClass(), interceptor);
方案2:使用Mix-in特性(无需修改原有类)
如果完全不想改动遗留类代码,可以通过Mix-in给代理类附加一个接口,拦截该接口的方法调用:
// 定义包含目标方法的接口 public interface ISampleMethods { void Method1(); void Method2(); } // 创建代理时附加该接口 var sampleClass = generator.CreateClassProxyWithTarget<SampleClass, ISampleMethods>(new SampleClass(), interceptor); // 必须通过接口类型调用才能触发拦截 ((ISampleMethods)sampleClass).Method1(); ((ISampleMethods)sampleClass).Method2();
验证效果
修改后运行代码,拦截器会正常执行,输出如下:
Executing Method 1... Method Method1. Executing Method 2... Method Method2.
内容的提问来源于stack exchange,提问作者Vitaly Filatenko
相关产品推荐
相关产品推荐

