Castle.DynamicProxy:带有Interceptor的CreateClassProxyWithTarget()不起作用,只能使用CreateInterfaceProxyWithTarget()

问题描述 投票:0回答:1

我正在尝试使用

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...");
    }
}
c# interceptor castle-dynamicproxy
1个回答
0
投票

我一整天都在尝试解决这个问题......直到发布到 StackOverflow 后我才明白出了什么问题:针对实例化类的代理无法覆盖非虚拟方法

所以,要么是接口,要么是虚拟方法。

如果有人提出最简单的方法,我会很高兴,但现在我必须生成接口。

© www.soinside.com 2019 - 2024. All rights reserved.