私はこのような例を書きました
シンプルな電卓クラス:
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);
}
Interceptorクラスを作成し、「Interceptor」クラスから継承しました
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
どうすれば修正できますか?
ベストアンサー1
メソッドをAdd
仮想化してみてください。
public class Calculator
{
public virtual int Add(int a, int b)
{
return a + b;
}
}
プロキシ ジェネレーターは、 を継承する新しいクラスを作成しますCalculator
。したがって、メソッドはAdd
オーバーライドを取得してインターセプションを可能にします。