在面向方面编程中加入点

时间:2014-03-25 09:26:06

标签: aop aspects pointcuts

我目前正在研究AOP及其重要部分,包括建议,切入点,加入点。 我从这个链接中读到了一个非常容易理解的解释,即建议切入点Aspect Oriented Programming vs. Object-Oriented Programming

但是,我很难理解加入点是什么。根据我的阅读,Join Points是程序结构中明确定义的位置,其中一个方面可以编织其建议代码。

但是,当它成为真实的例子时,我找不到任何好的例子来理解加入点的例子。

从上面链接中的示例中可以看出,如果Advice和Poincuts是下面的内容,那么我们定义加入点的位置是什么?

经典方法:

void set...(...) {
    :
    :
    Display.update();
}

建议:

after() : set() {
   Display.update();
}

Poincuts:

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);

1 个答案:

答案 0 :(得分:2)

void set...(...) 加入点


如您所知关注关注切入点关联点的关联

  • 跨领域问题的实施称为关注
  • 要关注问题的类中定义良好的位置是 Joinpoint
  • 通过配置或代码指定连接点的位置是切入点

关注对一个或多个利益相关方来说非常重要。另外,关注点在概念上可以分为两类(每种类型的实现可以是相同的):

副作用:一种不会改变连接点行为的问题,而是引入其他操作。

记录问题是副作用的一个很好的例子,

e.g。每次调用目标方法(这是连接点)BankWithdrawalHandler.Execute(ICommand command)将首先调用关注点LoggingConcern.Execute(ICommand command)

可以在Execute方法之前和之后运行,记录诸如开始时间/结束时间/总时间/参数/输出参数等内容。

副作用可以:

  • 根据需要检查/捕获目标切入点处的输入参数,并执行任何其他处理
  • 根据需要检查/捕获目标切入点处的输出结果,并执行任何其他处理

建议:可能会改变目标方法的输入和/或输出的问题。

缓存问题是一个简单的例子 - 例如每当运行时执行目标方法(这是连接点)Repository.Find<T>(long id)时,方法CacheConcern.Find<T>(long Id)将被配置为首先运行,并且只允许调用继续到Repository.Find()方法,如果在缓存中找不到该值。

建议可以:

  • 检查目标切入点处的输入参数并根据需要进行修改
  • 取消或避免执行目标方法并将其替换为其他实现
  • 检查目标方法的输出结果并根据需要修改或替换

在.NET中,有许多用于实现切入点的已建立技术:

  • 构建IL编织/ PostSharp
  • 依赖性反转(控制反转(IoC)和依赖性反转(DI))
  • 拦截/ DynamicProxy