我对Castle动态代理库做了一个简单的测试:
public class Printer
{
public virtual void Write(string msg)
{
Console.Write(msg);
}
}
public class CastleDynamicProxy
{
public static void Test()
{
ProxyGenerator generator = new ProxyGenerator();
Printer logger = generator.CreateClassProxy<Printer>(new TestInterceptor());
logger.Write("Hello, World!");
}
}
现在在我的拦截器中,我想对函数计时,但它会导致StackOverflowException,因为我在拦截方法中调用目标方法,导致无限循环:
public class TestInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
var accessor = invocation.Proxy as IProxyTargetAccessor;
MethodInfo target = accessor.DynProxyGetTarget().GetType().GetMethod("Write");
var s = Stopwatch.StartNew();
target.Invoke(invocation.InvocationTarget, invocation.Arguments);
s.Stop();
}
}
无论如何围绕这一点,要么1)停止拦截过程完全,或2)删除我的拦截器后,我已经使用它为我需要的,进入无限循环之前?
你确定要这么做吗?我还创建了一个计时拦截器,以查看方法调用(如DB查询)是否超过阈值,如果超过阈值,则记录它。
不需要手动调用目标,只需使用invocation.Proceed()
来告诉它继续执行拦截的呼叫。
我的代码是这样的:
public void Intercept(IInvocation invocation)
{
var timer = Stopwatch.StartNew();
// i think you want this to proceed with the invocation...
invocation.Proceed();
timer.Stop();
// check if threshold is exceeded
if (timer.Elapsed > _threshold)
{
// log it to logger of choice
}
}