我正在尝试使用
Castle.DynamicProxy
和 IInterceptor
创建简单的记录器,但无法在没有接口的情况下为 类实现它:在这种情况下,IInterceptor
代码不会执行。
我能够使用
CreateInterfaceProxyWithTarget()
对具有接口的类执行此操作,但不幸的是,它不够方便,因为我们的遗留项目有大量没有接口的类。是的,我可以使用 Visual Studio 来提取界面...但如果可能的话,我宁愿避免它。
using Castle.DynamicProxy;
var generator = new ProxyGenerator();
var interceptor = new Interceptor();
// works, but requires the interface
//var sampleClass = generator.CreateInterfaceProxyWithTarget<ISampleClass>(new SampleClass(), interceptor);
// doesn't work
//var sampleClass = generator.CreateClassProxy<SampleClass>(interceptor);
// doesn't work too
var sampleClass = generator.CreateClassProxyWithTarget(new SampleClass(), interceptor);
sampleClass.Method1();
sampleClass.Method2();
public class Interceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
invocation.Proceed();
Console.WriteLine($"Method {invocation.Method.Name}.");
}
}
public interface ISampleClass
{
void Method1();
void Method2();
}
public class SampleClass : ISampleClass
{
public void Method1()
{
Console.WriteLine("Executing Method 1...");
}
public void Method2()
{
Console.WriteLine("Executing Method 2...");
}
}
我一整天都在尝试解决这个问题......直到发布到 StackOverflow 后我才明白出了什么问题:针对实例化类的代理无法覆盖非虚拟方法。
所以,要么是接口,要么是虚拟方法。
如果有人提出最简单的方法,我会很高兴,但现在我必须生成接口。