我写了一个这样的例子
简单计算器类:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}实现了DynamicProxy提供的"IInterceptor“
[Serializable]
public abstract class Interceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
ExecuteBefore(invocation);
invocation.Proceed();
ExecuteAfter(invocation);
}
protected abstract void ExecuteAfter(IInvocation invocation);
protected abstract void ExecuteBefore(IInvocation invocation);
}创建了一个拦截器类,并从“拦截器”类继承。
public class CalculatorInterceptor : Interceptor
{
protected override void ExecuteBefore(Castle.DynamicProxy.IInvocation invocation)
{
Console.WriteLine("Start");
}
protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation)
{
Console.WriteLine("End");
}
}但是当我用它不起作用时!
static void Main(string[] args)
{
ProxyGenerator generator = new ProxyGenerator();
Calculator c = generator.CreateClassProxy<Calculator>(new CalculatorInterceptor());
var r = c.Add(11, 22);
Console.WriteLine(r);
Console.ReadKey();
}我不想看到这样的事情:
START
33
END但只有表演
33我怎么才能改正呢?!
发布于 2015-02-14 19:06:54
尝试将方法Add变为虚拟的。
public class Calculator
{
public virtual int Add(int a, int b)
{
return a + b;
}
}代理生成器创建继承Calculator的新类。因此,Add方法获得了一个覆盖,从而使拦截成为可能。
发布于 2016-10-26 22:59:40
另一种选择是创建一个ICalculator接口
public interface ICalculator
{
int Add(int a, int b);
}并从这个接口继承类。
public class Calculator : ICalculator
{
public int Add(int a, int b)
{
return a + b;
}
}然后,动态代理将使用CreateInterfaceProxyWithTarget方法。
var proxyGenerator = new ProxyGenerator();
ICalculator calculator = new Calculator()
var proxy = proxyGenerator.CreateInterfaceProxyWithTarget(
calculator,
ProxyGenerationOptions.Default,
new CalculatorInterceptor());
Console.WriteLine(proxy.Add(1, 2));这将消除Calculator类中的虚拟,在我看来,这是一个糟糕的设计,除非您将来有理由重写该方法。
发布于 2015-02-14 18:33:59
您必须使用正确的重载,并传入目标对象和希望使用的拦截器。方法应该如下所示:
var proxy = generator.CreateClassProxy<Calculator>(new Calculator(), new CalculatorInterceptor() );https://stackoverflow.com/questions/28518700
复制相似问题