Castle Dynamic Proxy无法正常工作?

时间:2017-10-02 23:12:19

标签: c# .net castle-dynamicproxy

我有以下课程:

public class MyTest
{
    public void Test()
    {

    }
}

我创建了以下拦截器:

public class MyInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        invocation.Proceed();
    }
}

在我的代码中,我这样做:

        ProxyGenerator g = new ProxyGenerator();

        g.CreateClassProxy<MyTest>(new MyInterceptor());

        MyTest t = new MyTest();
        t.Test();

不应该在调试器中点击Intercept方法吗?它不是。我错过了什么吗?

编辑:这是特定于Castle DynamicProxy。

2 个答案:

答案 0 :(得分:0)

您必须将public void Test()设为public virtual void Test(),以便允许Castle DynamicProxy拦截该方法。

  

动态代理是一种从类或类生成子类的方法   其界面通常是模型。该子类重写每一个   它可以的方法(让你的方法虚拟以允许这样做)。

有关Castle Dynamic Proxy的更多文档:

https://richardwilburn.wordpress.com/2009/12/17/using-castles-dynamic-proxy/

http://putridparrot.com/blog/dynamic-proxies-with-castle-dynamicproxy/

答案 1 :(得分:0)

CreateClassProxy创建所谓的基于继承的代理。基于继承的代理是通过继承基类创建的。代理拦截对类的虚拟成员的调用,并将它们转发给基本实现。因此,只能拦截该类的虚拟成员。在您的示例中,您应将Test方法标记为virtual。请参阅here

public class MyTest
{
    public virtual void Test()
    {
        Console.WriteLine("Hi");
    }
}

public class MyInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Was here");
        invocation.Proceed();
    }
}

void Main()
{
    ProxyGenerator g = new ProxyGenerator();
    var t = g.CreateClassProxy<MyTest>(new MyInterceptor());
    t.Test();
}