首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在IInterceptor中使用Castle.DynamicProxy?

如何在IInterceptor中使用Castle.DynamicProxy?
EN

Stack Overflow用户
提问于 2015-02-14 18:17:06
回答 3查看 17.4K关注 0票数 21

我写了一个这样的例子

简单计算器类:

代码语言:javascript
复制
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

实现了DynamicProxy提供的"IInterceptor“

代码语言:javascript
复制
 [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);
}

创建了一个拦截器类,并从“拦截器”类继承。

代码语言:javascript
复制
    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");
    }
}

但是当我用它不起作用时!

代码语言:javascript
复制
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();
    }

我不想看到这样的事情:

代码语言:javascript
复制
START
33
END

但只有表演

代码语言:javascript
复制
33

我怎么才能改正呢?!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-14 19:06:54

尝试将方法Add变为虚拟的。

代码语言:javascript
复制
public class Calculator
{
    public virtual int Add(int a, int b)
    {
        return a + b;
    }
}

代理生成器创建继承Calculator的新类。因此,Add方法获得了一个覆盖,从而使拦截成为可能。

票数 22
EN

Stack Overflow用户

发布于 2016-10-26 22:59:40

另一种选择是创建一个ICalculator接口

代码语言:javascript
复制
public interface ICalculator
{
   int Add(int a, int b);
}

并从这个接口继承类。

代码语言:javascript
复制
public class Calculator : ICalculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

然后,动态代理将使用CreateInterfaceProxyWithTarget方法。

代码语言:javascript
复制
var proxyGenerator = new ProxyGenerator();

ICalculator calculator = new Calculator()

var proxy = proxyGenerator.CreateInterfaceProxyWithTarget(
    calculator,
    ProxyGenerationOptions.Default,
    new CalculatorInterceptor());

Console.WriteLine(proxy.Add(1, 2));

这将消除Calculator类中的虚拟,在我看来,这是一个糟糕的设计,除非您将来有理由重写该方法。

票数 13
EN

Stack Overflow用户

发布于 2015-02-14 18:33:59

您必须使用正确的重载,并传入目标对象和希望使用的拦截器。方法应该如下所示:

代码语言:javascript
复制
var proxy = generator.CreateClassProxy<Calculator>(new Calculator(), new CalculatorInterceptor() );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28518700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档