使用autofac和dynamicproxy2选择性地拦截方法

时间:2010-04-18 16:31:55

标签: c# autofac castle-dynamicproxy

我目前正在尝试使用Autofac-1.4.5.676,autofac contrib和城堡DynamicProxy2。目标是创建一个粗粒度的分析器,可以拦截对特定接口的特定方法的调用。

问题:我的一切都与选择性部分完全分开。我可能是错的,但我认为我需要将我的拦截器与IProxyGenerationHook实现结合起来,但我无法弄清楚如何做到这一点。

我的代码看起来像这样:

要截取的界面& profiled(请注意,我只关心分析 Update()方法)

public interface ISomeSystemToMonitor
{
    void Update(); // this is the one I want to profile
    void SomeOtherMethodWeDontCareAboutProfiling();
}

现在,当我使用容器注册我的系统时,我会执行以下操作:

// Register interceptor gubbins
builder.RegisterModule(new FlexibleInterceptionModule());
builder.Register<PerformanceInterceptor>();

// Register systems (just one in this example)
builder.Register<AudioSystem>()
.As<ISomeSystemToMonitor>)
.InterceptedBy(typeof(PerformanceInterceptor)); 

从容器中拉出的所有ISomeSystemToMonitor实例都会被截取并根据需要进行分析,除了它将拦截其所有方法,而不仅仅是Update方法。

现在,我如何扩展它以排除Update()以外的所有方法?正如我所说,我不明白我是怎么通知容器的,“对于ProfileInterceptor,使用IProxyHookGenerator的这个实现”。

所有帮助赞赏,欢呼!另请注意,我现在无法升级到autofac2.x;我坚持1。

2 个答案:

答案 0 :(得分:1)

生成拦截器时,必须将IProxyGenerationHook实例传递给CreateInterfaceProxyWithTarget调用。有关更多详细信息,请参阅this tutorial

目前,似乎没有办法在不更改Autofac.DynamicProxy2集成模块的情况下提供此类挂钩。可能是InterceptedBy扩展程序的一个很好的补充。

或者,您可以将过滤构建到PerformanceInterceptor。查看您在调用时传递的IInvocation,检查Method属性以决定是否要进行概要分析。但这当然不如绕过代理级别的拦截效率。

答案 1 :(得分:0)

对于DynamicProxy2,EnableInterfaceInterceptors方法现在有一个带有ProxyGenerationOptions对象的重载。

//Define the builder
var builder = new ContainerBuilder();

//Instantiate your Proxy options with a selector
var proxyOptions = new ProxyGenerationOptions {Selector = new MyInterceptSelector()};

//Pass the proxy options as a parameter to the EnableInterfaceInterceptors method
builder.RegisterType<MyRepo>()
            .As<IMyRepo>()
            .EnableInterfaceInterceptors(proxyOptions)
            .InterceptedBy(typeof(IInterceptor));