我对Castle Dynamic Proxy库进行了简单的测试:
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,因为我在Intercept方法中调用了target方法,导致无限循环:
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)在我进入无限循环之前将其用于我所需要的之后移除我的拦截器?
答案 0 :(得分:3)
你确定这是你想做的吗?我也创建了一个计时拦截器,以查看方法调用(例如数据库查询)是否超过阈值,如果是,则记录它。
不要手动调用目标,只需使用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
}
}