针对C#(.Net)的面向方面编程(AOP)解决方案及其功能

Ras*_*sto 30 .net c# aop

我想在这里要求3个信息:

  1. Microsoft的 C#(.Net)中,没有面向方面编程(AOP)的集成解决方案是正确的吗?是否有任何此类解决方案正在开发或计划中?

  2. 哪些解决方案允许在C#(.Net)中使用面向方面编程(AOP)?它们的优点/缺点是什么?我没有找到任何包含所有可用选项的综合列表和一些信息供我决定使用哪一个.最接近的是这个列表.

  3. 什么是(在您看来)考虑以下标准的C#(.Net)的最佳AOP解决方案:

    1. 它可以像AspectJ一样工作,并且具有类似的语法
    2. 使用简单:不需要XML配置 - 只需编写一些常规类,一些方面类并编译以将它们编织在一起,然后运行.
    3. 应该包括AspectJ的所有功能.支持泛型.
    4. 解决方案应该稳定,广泛使用和维护.
    5. 应提供编织二进制文件(可以使用)或C#源代码.
    6. 用于可视化(甚至更好 - 插件到VS)的GUI工具是一个优势.

我认为,如果某些内容满足3中的大多数标准,那么它就是常用解决方案的候选者.如果某些现有解决方案符合我的需求,我无处可寻.

Rog*_*son 18

正如Adam Rackis指出的那样,Post#是要走的路,你可以在.NET平台上接近AspectJ.

主要区别显然是AspecJ对方面有语言支持,而Post#是.NET程序集的后编译编织器.(因此没有语言整合)

但是,Post#可以使用连接点,例如字段访问,尝试catch块,调用和函数(即调用者和被调用者)

  1. 甚至没有关闭,AspectJ是一种语言,Post#可以使用自定义切入点,但最常见的是使用属性来装饰要切入的方法(eh..grammar?)

  2. 校验

  3. 一切,但语言支持

  4. 校验

  5. 检查 - 这是一个后编译编织器

  6. 有限的,编织者将生成智能感知信息并显示受影响的方法

如果您需要支持方面的.NET语言,请查看http://aspectsharpcomp.sourceforge.net/samples.htm

关于不同的方法,有几个:

  1. 编译后编织,这就是Post#的作用.它只是破坏.NET程序集并注入方面代码.

  2. Real Proxy/MarshallByRefObject.基于远程基础设施.要求您的类继承自基类.表现极差,没有"自我拦截"

  3. 动态代理.这就是我的旧库NAspect所使用的.您使用工厂来创建要应用方面的类型的子类.子类将使用接口添加mixin代码并覆盖虚拟方法并注入拦截器代码.

  4. 源代码编织.顾名思义,它会在编译之前转换您的源代码.

[编辑]我忘了把这个添加到列表中:

  1. 接口代理与动态代理类似,但不是将拦截代码应用于子类,而是将拦截代码添加到运行时生成的接口代理中.也就是说,你得到一个实现给定接口的对象,然后该对象首先将对每个接口方法的调用委托给AOP拦截代码,然后将调用委托给真实对象.也就是说,你在这里有两个对象,代理和主题(你的真实对象).

Client -> Interface Proxy -> AOP interception -> Target/Subject

这是AFAIK Spring的功能.

1)和3)是最常见的.他们都有利有弊:

后编译:

优点:

  • 可以点几乎所有东西,静态,密封,私人
  • 仍然可以使用"new"创建对象

缺点:

  • 无法根据上下文应用方面,也就是说,如果类型受到影响,它将受到整个应用程序的影响.

  • 切入私有的,静态的,密封的结构可能会导致混淆,因为它违反了基本的OO规则.

动态代理:

优点:

  • 上下文,一个典型可以根据上下文应用不同的方面.

  • 易于使用,无需配置或构建步骤.

缺点:

  • 有限的切入点,只能拦截接口成员和虚拟成员

  • 必须使用工厂来创建对象