Autofac + Castle DynamicProxy:拦截器的顺序

Posted

技术标签:

【中文标题】Autofac + Castle DynamicProxy:拦截器的顺序【英文标题】:Autofac + Castle DynamicProxy: Order of interceptors 【发布时间】:2012-03-31 08:21:58 【问题描述】:

我正在使用带有 Autofac 的 Castle DynamicProxy。我有一个对象,我为其创建了一个代理,并且我有两个作用于代理的拦截器,一个用于记录异常,第二个用于更改方法的返回值。注册码如下:

var builder = new ContainerBuilder();

builder.Register(c => c.Resolve<ProxyGenerator>()
    .CreateClassProxy<Foo>(
        c.Resolve<ResultProcessorInterceptor>(),
        c.Resolve<ExceptionLoggingInterceptor>()))
    .As<Foo>();

通过按此顺序提供参数,我发现我得到了我想要的结果,即记录了异常并处理了结果。如果我颠倒参数的顺序,则不会发生日志记录。

那么我的问题是:以这种方式注册,拦截器是否保证每次都以相同的顺序执行?或者有没有更好的方法来确保订单每次都是我想要的?

FWIW,我查看了 IInterceptorSelector 接口。也许我遗漏了一些东西——这并非不可能——但在这种情况下看起来这并不相关。但如果我错了,我很乐意得到纠正。

如有必要,我可以提供更长的代码示例。

音乐家

【问题讨论】:

【参考方案1】:

是的,默认情况下,拦截器将按照为每个被拦截方法提供的顺序执行。

正如您正确指出的那样,如果需要,您可以使用 IInterceptorSelector 在每个方法的基础上覆盖它。

【讨论】:

以上是关于Autofac + Castle DynamicProxy:拦截器的顺序的主要内容,如果未能解决你的问题,请参考以下文章

依赖反转Ioc和unity,autofac,castle框架教程及比较

Autofac

Autofac 依赖注入框架

依赖注入容器-- Autofac

Autofac依赖注入框架使用

浅析依赖注入框架Autofac的使用