使用城堡动态代理-可以控制和/或删除拦截器



我对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
            }
        }

相关内容

  • 没有找到相关文章

最新更新