1

我研究了一些著名的面向 AOP 的 .Net 框架,例如 Microsoft 的 PostSharp、bltoolkit、Castle、Cecil 和 Policy Injection Block。也许我很无知,但似乎这些框架不提供在虚拟机加载类时注入代码的能力,在应用程序可见之前。它们似乎都依赖于应用程序对工厂的使用或类/方法级别的属性,这些属性提供了程序集的编译时操作所需的元数据。我正在寻找 的java.lang.instrument的关键特性是在方法调用周围简单地注入拦截器,而无需更改源(方法/类的属性)或重建现有程序集以注入拦截代码。

4

2 回答 2

2

您说得对,大多数 .NET 的 AOP 框架都要求您使用特殊类型的工厂等创建对象。原因是 .NET 中的(自定义)属性是被动的,因此您需要某种可以及时检查这些属性的框架。

有一些 .NET 的 AOP 框架使用代码生成或 IL 编织(在正常编译后修改中间语言字节码)来允许拦截,但我总是远离这样的事情 - 有很多固有的问题这样的做法。

我曾经有机会问 Anders Hejlsberg,我们是否不能在 .NET 中获得“活动”属性,但他的回答是,如果微软提供这样的能力,他们还不如停止该平台的所有进一步开发,因为它会如果不破坏与某人代码的兼容性,就不可能向前推进 .NET(我可能歪曲了他的答案,但重要的部分是它已被考虑并拒绝 - 显然是有充分理由的)。

也就是说,.NET 有一个可以拦截任何方法调用的 Instrumentation API。然而,该 API 是一个非托管 API(它要求您编写非托管 C++ 代码)并且 (IIRC) 要求您自己托管 .NET 应用程序。这是一种非常严厉的方法。您还应该意识到 Instrumentation 可能会损害您的应用程序的性能。

于 2009-07-02T04:38:11.323 回答
1

您是否看过这篇文章:比较 IoC 框架

于 2009-07-02T04:23:48.150 回答