It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center




9年前关闭。




我想在此询问3个信息:
  • 没有,没有Microsoft的C#(.Net)中面向方面编程(AOP)的集成解决方案。是正确的吗?是否正在开发或计划中任何此类解决方案?
  • 有哪些解决方案允许在C#(.Net)中使用面向方面的编程(AOP)?它们有哪些优点/缺点?我找不到任何包含所有可用选项和一些信息的综合列表,这些信息可以让我决定使用哪一个。最接近的是this list
  • (您认为)是什么,对于C#(。Net),最佳的AOP 解决方案,考虑以下标准:
  • 它的工作方式类似于AspectJ,语法类似于
  • 使用简单:不需要XML配置-只需编写一些常规类,某些方面类并进行编译以将其编织在一起,然后运行即可。
  • 应该包含AspectJ的所有功能。支持泛型。
  • 解决方案应稳定,广泛使用和维护。
  • 应该提供二进制编织(因此可以使用)或C#源代码。
  • 用于可视化(甚至更好-VS插件)的GUI工具是一个优势。


  • 我认为,如果某些内容满足了3.中的大多数标准,那么它是通用解决方案的候选对象。而且我无法在任何地方找到一些现有的解决方案是否适合我的需求。

    最佳答案

    正如Adam Rackis所指出的那样,Post#是必经之路,您将在.NET平台上与AspectJ距离很近。

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

    但是,Post#可以使用诸如现场访问,尝试catch块,调用和函数(即,调用方和被调用方)之类的连接点

  • 甚至没有关闭,AspectJ是一种语言,Post#可以使用自定义切入点,但是最常见的是使用属性来装饰要切入点的方法(eh..grammar?)
  • 检查
  • 除了语言支持之外的所有内容
  • 检查
  • 检查-这是一个后编译的编织器
  • 受限制,编织器将生成智能信息并显示哪些方法受到了影响

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

    关于不同的方法,有以下几种:
  • Post编译编织,这就是Post#所做的。
    它仅处理.NET程序集并注入(inject)方面代码。
  • 真正的代理/MarshallByRefObject。
    基于远程基础架构。
    要求您的类从基类继承。
    极端糟糕的性能,没有“自我拦截”功能
  • 动态代理。
    这就是我的旧图书馆NAspect所使用的。
    您使用工厂来创建要在其上应用方面的类型的子类。
    子类将使用接口(interface)添加混合代码,并覆盖虚拟方法并注入(inject)拦截器代码。
  • 源代码编织。
    顾名思义,它可以在编译之前转换您的源代码。

  • [编辑]我忘记将此添加到列表中:
  • 接口(interface)代理
    与动态代理类似,但不是将侦听代码应用于子类,而是将侦听代码添加到运行时生成的接口(interface)代理中。
    也就是说,您将获得一个实现给定接口(interface)的对象,然后该对象将每个接口(interface)方法的每次调用都首先委派给AOP拦截代码,然后将调用委派给实际对象。
    也就是说,您在这里有两个对象,代理服务器和主题(您的真实对象)。
  • Client -> Interface Proxy -> AOP interception -> Target/Subject
    这就是Spring的AFAIK。

    1)和3)是最常见的。
    他们都有优点和缺点:

    编译后:

    优点:
  • 可以切出几乎所有内容,包括静态,密封,私有(private)
  • 仍然可以使用“新建”
  • 创建对象

    缺点:
  • 无法基于上下文应用方面,即,如果一种类型受到影响,它将在整个应用程序中受到影响。
  • 切入私有(private),静态,密封构造的切入点可能会导致困惑,因为它破坏了基本的OO规则。

  • 动态代理:

    优点:
  • 上下文,一个类型可以基于上下文应用不同的方面。
  • 易于使用,无需配置或构建步骤。

  • 缺点:
  • 切入点有限,只能拦截接口(interface)成员和虚拟成员
  • 必须使用工厂来创建对象
  • 关于c# - C#(.Net)的面向方面编程(AOP)解决方案及其功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4999144/

    10-13 03:14