面向方面的编程

发布于:2021-01-27 10:35:56

0

72

0

AOP 面向方面编程 Action

面向方面编程(AOP)是一个非常好的概念,但实施起来有点困难。

老实说,我不认为我真的见过它成功的实现,我的意思是,我确实见过一些例子,说明如何将它用于“跨领域”的关注,比如日志记录。

问题是它通常很难使用,而我能想到的唯一实际应用就是日志记录。我知道,这可能只是我在这方面的知识不足,不过,如果您能接受我的建议,我将向您展示一个巧妙的小技巧,您可以通过执行类似于AOP使用Action<>所做的操作来解决跨领域的问题。

把它放在一个地方

AOP试图解决的主要问题是将存在于许多不同地方的软件的某些方面浓缩到一个地方,以便您进行维护。

异常处理和日志记录往往是这些横切关注点中最臭名昭著的,毫无疑问,在代码中的许多地方,您都有许多捕获异常的实例,而您唯一真正能做的就是记录它。

我将向您展示一种使用Action<>的简单方法。

我从我的一个同事写的代码中得到了这个想法(他是个天才)。

他写了一些代码来完成我将要向您展示的工作,但是在重试数据库查询时,他能够减少代码库中的许多地方,在这些地方,当出现死锁或超时时,我们有重复的逻辑来重试执行数据库查询。

这个代码属于您的吗?

{xunruicms_img_title}

忽略我在这里遇到的一个普遍的例外,这是一个不好的做法,但有时你所要做的就是记录发生的任何不好的事情并继续前进。

在try块中执行某些操作并捕获异常以记录异常是很常见的。

想想这些代码或类似的东西可能会在您的代码库中出现多少次。

Action<>

如果您不熟悉Action <>,请查看我的这篇文章--《解释什么是动作和函数》,它对操作的工作原理给出了非常简单的解释。

我们可以采用try、catch和log异常的逻辑,并将其放入一个只随我们所做的操作而变化的方法中。

{xunruicms_img_title}

我不太喜欢静态方法,但在某些情况下,它们是有意义的。另一种选择是将所有这些代码散布在整个代码库中。

现在我们有了这个方法,我们可以做任何我们想做的事情,并且知道如果有错误它将被记录。

看看这个:

{xunruicms_img_title}

如果您决定要更改记录错误的方式或对错误执行的操作,可以在一个地方全部更改。

不仅用于记录

您可以将这种解决方案应用到代码库中涉及交叉问题的许多地方。

以下是一些建议,供您考虑使用这种解决方案:

  • 重试失败逻辑。

  • 为故障使用替代服务(Web服务“ A”失败,但我们可以使用Web服务“ B”)。

  • 数据库连接和连接关闭逻辑。(打开连接,执行某些操作,关闭连接。)。