我查看了一些着名的面向AOP的.Net框架,如PostSharp,bltoolkit,Castle,Cecil和Microsoft的Policy Injection Block。也许我是无知的,但似乎这些框架不提供在虚拟机加载类时,在应用程序可见之前注入代码的能力。它们似乎都依赖于应用程序使用工厂或类/方法级别属性,这些属性提供编译时程序集操作所需的元数据。我正在寻找的java.lang.instrument的关键特性是简单地在方法调用周围注入拦截器而不改变源(方法/类的属性)或重建现有的程序集以注入拦截代码。
答案 0 :(得分:2)
您是正确的,大多数.NET的AOP框架都要求您使用特殊类型的工厂等创建对象。原因是.NET中的(自定义)属性是被动的,因此您需要某种可以及时检查这些属性的框架。
有一些.NET的AOP框架使用代码生成或IL编织(在正常编译后修改中间语言字节代码)以允许拦截,但我总是远离类似的东西 - 有很多这种方法存在固有问题。
我曾经有机会向Anders Hejlsberg询问我们是否无法在.NET中获得“主动”属性,但他的回答是,如果微软提供这样的功能,他们不妨停止平台的所有进一步开发,因为在不破坏与某人代码的兼容性的情况下移动.NET是不可能的(我可能会误解他的答案,但关键部分是它已经被考虑和拒绝 - 显然是有充分理由的。)
也就是说,.NET有一个可以拦截任何方法调用的Instrumentation API。但是,该API是一个非托管API(它要求您编写非托管C ++代码),而(IIRC)要求您自己托管.NET应用程序。这是一种非常严厉的方法。您还应该知道,Instrumentation可能会损害您的应用程序的性能。
答案 1 :(得分:1)
您是否看过这篇文章:comparing IoC frameworks?