1

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

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

4

1 回答 1

0

Autofac.Extras.DynamicProxy2 库开箱即用不支持这样的功能。您可能会使用类似于 Autofac.Extras.DynamicProxy2 中的代码的代码来实现像处理每个组件的OnActivating的模块之类的东西,但是您会遇到麻烦,例如...

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

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

有关我正在谈论的模块实现类型的示例,请查看 Autofac wiki 上的 log4net 集成页面。这显示了如何处理系统中每个组件的 OnPreparing。您可以做同样的事情,但处理 OnActivating 并使用 Lifetime Events wiki 页面上的示例向您展示如何将一个已解决的事情交换为另一个(将真实对象交换为生成的代理)。

于 2013-05-08T18:16:16.740 回答