我有以下课程:
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。
答案 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();
}