Castle Dynamic Proxy在从类中调用时不拦截方法调用

Geo*_*ild 14 c# castle-dynamicproxy dynamic-proxy

使用Castle的动态代理时,我遇到了一些(我认为)奇怪的行为.

使用以下代码:

class Program
{
    static void Main(string[] args)
    {
        var c = new InterceptedClass();
        var i = new Interceptor();

        var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);

        cp.Method1();
        cp.Method2();

        Console.ReadLine();
    }
}

public class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine(string.Format("Intercepted call to: " + invocation.Method.Name));

        invocation.Proceed();
    }
}

public class InterceptedClass
{
    public virtual void Method1()
    {
        Console.WriteLine("Called Method 1");
        Method2();
    }

    public virtual void Method2()
    {
        Console.WriteLine("Called Method 2");
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待获得输出:

  • 截获的电话:Method1
  • 称为方法1
  • 截获的电话:方法2
  • 称为方法2
  • 截获的电话:方法2
  • 称为方法2

然而,我得到的是:

  • 截获的电话:Method1
  • 称为方法1
  • 称为方法2
  • 截获的电话:方法2
  • 称为方法2

据我所知,如果调用来自类本身之外,动态代理只能代理方法调用,因为当从Program调用而不是从InterceptedClass中调用时,拦截了Method2.

我可以理解,当从代理类中进行调用时,它将不再通过代理,但只是想检查这是否是预期的,如果是,那么无论如何都要查看是否有所有被截获的呼叫他们被叫到哪里?

谢谢

Jon*_*eet 17

编辑:tl; dr - 我刚尝试以不同的方式创建代理,如下所述,它产生你所追求的输出.我只需要改变这个:

var c = new InterceptedClass();
var i = new Interceptor();

var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);
Run Code Online (Sandbox Code Playgroud)

对此:

var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxy<InterceptedClass>(i);
Run Code Online (Sandbox Code Playgroud)

据我了解,代理生成器有效地创建了一个包装器对象.它们是两个独立的对象 - 一个是围绕另一个的包装器,在包装层中有拦截等.

这是很难看到它如何能够改变什么的实例InterceptedClass确实有自己的方法调用:

  • DynamicProxy无法更改现有对象的类型; 创建对象后,其类型是固定的
  • DynamicProxy无法更改绑定现有对象的现有调用的方式

如果要使用当前代理创建代码通过包装器进行Method1调用Method2 ,则需要告知现有对象有关包装器的信息,可以是其中的字段,也可以是方法参数.

另外,有可能是创建代理开始与不同的方式-一个在代理在某种意义上目标对象.我怀疑你可能想看CreateClassProxy而不是CreateClassProxyWithTarget- 我怀疑这是你提供导致你出问题的目标对象的事实.

你所看到的行为是否"预期"或者显然取决于你的期望 - 但这肯定是所期望的,而不知道任何有关Castle Dynamic Proxy :)的信息