我目前正在尝试使用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。
答案 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));