拦截所有服务

时间:2013-05-08 12:19:00

标签: c# autofac

我们的应用程序中的生命周期范围很小。能够拦截autofac中注册的所有服务将会很有趣。通过这样做,我们可以确切地看到代码为每个生命周期范围采用的路径以及使用的方法参数。不是真的可以用于生产,但是当你在整个画面而不仅仅是单元级别时非常适合调试/诊断/重构。

但AFAIK只能为每次注册注册一个拦截器吗?

1 个答案:

答案 0 :(得分:0)

使用Autofac.Extras.DynamicProxy2库开箱即可支持此类内容。您可以使用类似于以下代码的方式实现类似于为每个组件处理OnActivating的模块。 Autofac.Extras.DynamicProxy2中的内容,但你会遇到麻烦......

  • 您是否需要类拦截器或接口拦截器?要解析的服务类型与支持它的组件的限制类型将影响您要制作的动态代理类型。我相信当前的A.E.D2代码只会为/或 - 而不是每个类实现的接口等生成拦截。
  • 您是否使用WCF客户端代理?客户端代理是他们自己的一个有趣的野兽,因此您必须对它们进行特殊处理。你会在A.E.D2中看到它。

通常这样的问题可以通过面向方面的编程解决方案(例如PostSharp)或剖析器(例如ANTS)......或两者的组合来解决。如果你有能力,你可能想要研究这些解决方案。

有关我正在谈论的模块实现的示例,check out the log4net integration page on the Autofac wiki。这显示了如何为系统中的每个组件处理OnPreparing。您可以执行相同的操作,但是处理OnActivating而不是use the sample on the Lifetime Events wiki page来向您展示如何将一个已解析的东西交换为另一个(将实际对象交换为生成的代理)。