我们是否在生产软件中使用AOP(面向方面​​的编程)?

时间:2020-03-05 18:41:40  来源:igfitidea点击:

在我看来,AOP是一种有趣的编程范例。但是,在这里还没有关于stackoverflow的讨论(至少我找不到它们)。我们总体上对此有何看法?我们在项目中使用AOP吗?还是我们认为这是一个相当小的利基技术,不会存在很长时间或者不会成为主流(就像OOP一样,至少在理论上是这样)?

如果我们确实使用AOP,请让我们知道我们也使用了哪些工具。谢谢!

解决方案

回答

我们在一个大型项目中使用了AspectJ很长时间了。该项目由多个Web服务组成,每个Web服务都具有多个功能,这是复杂的文档处理/查询系统的前端。大约75,000行代码的某个位置。我们将方面用于两个相对次要的功能。

首先是跟踪应用程序流。我们创建了一个方面,在每个函数调用之前和之后运行,以打印出"输入的'函数'"和"退出的'函数'"。使用函数选择器(可能是切入点?我不记得正确的名字了),我们可以将其用作调试工具,仅选择在给定时间要跟踪的函数。对于我们项目中的各个方面,这确实是很好的用法。

我们要做的第二件事是特定于应用程序的指标。我们围绕我们的Web服务方法来收集方面信息,以捕获时间,对象信息等,并将结果转储到数据库中。很好,因为我们可以捕获此信息,但仍将所有捕获代码与完成工作的"真实"代码分开。

我已经读到了一些可以将各个方面带到桌面上的不错的解决方案,但是我仍然不相信它们真的可以做我们用"常规"技术做不到(也许更好)的任何事情。例如,我无法想到我们的任何项目所需要的任何主要特征或者功能,如果没有我认为有用的方面就是我所提到的那种次要事情,就无法轻易完成。

回答

是的。

像安全性这样的正交问题最好通过AOP样式的拦截来解决。这是自动完成(通过诸如依赖项注入容器之类的操作)还是手动完成对于最终目标而言并不重要。

一个示例:xUnit.net(我运行的一个开源项目)中的" before / after"属性是一种AOP风格的方法拦截方法。我们使用这些属性装饰测试方法,并且在该测试方法运行之前和之后,都会调用代码。它可以用于诸如建立数据库,回滚结果,更改测试运行的安全性上下文等操作。

另一个示例:ASP.NET MVC中的筛选器属性也像专门的AOP样式方法拦截器一样起作用。例如,一种允许我们说出未处理的错误(如果它们发生在操作方法中)应如何处理。

许多依赖项注入容器,包括Castle Windsor和Unity,都"在盒子里"或者通过使用扩展来支持这种行为。

回答

Python通过允许我们在运行时动态修改其类来支持AOP(在Python中通常称为Monkeypatching而不是AOP)。这是我的一些AOP用例:

  • 我有一个网站,其中每个页面都是由Python函数生成的。我想上一堂课,并对该类生成的所有网页进行密码保护。 AOP进行了救援;在调用每个函数之前,我会进行适当的会话检查,并在必要时重定向。
  • 我想在程序的实际使用过程中对其程序中的一些函数进行一些日志记录和性能分析。 AOP让我可以计算时序并将数据打印到日志文件,而无需实际修改任何这些功能。
  • 我有一个充满非线程安全功能的模块或者类,我发现自己在一些多线程代码中使用它。一些AOP在这些函数调用周围增加了锁定,而不必进入库并进行任何更改。

这种事情并不经常出现,但是无论何时,猴子补丁都是非常有用的。 Python还具有装饰器,该装饰器实现Decorator设计模式(http://en.wikipedia.org/wiki/Decorator_pattern)以完成类似的工作。

请注意,动态修改类还可以使我们解决错误或者将功能添加到第三方库,而无需实际修改该库。我几乎永远不需要这样做,但是它出现了几次却非常有用。

回答

我在C应用程序中大量使用AOP。我不是必须使用属性的忠实拥护者,因此我使用Castle DynamicProxy和Boo在运行时应用方面而不会污染我的代码

回答

在Terracotta,我们相当广泛地使用AOP和字节码检测工具来与第三方软件集成并对其进行检测。例如,我们的Spring集成在很大程度上是通过使用Aspectwerkz来完成的。简而言之,我们需要在各个点拦截对Spring Bean和Bean工厂的调用,以便将它们聚类。

因此,AOP对于与无法修改的第三方代码集成很有用。但是,我们发现,如果可能的话,存在很大的陷阱,请仅在联接点中使用第三方公共API,否则,我们可能会在下一个次要版本中更改某些私有方法,从而有可能破坏代码,并且它变成了维护噩梦。

回答

AOP和事务划分是天作之合。我们使用Spring AOP @Transaction批注,它使tx划分比我在其他任何地方都更加容易和直观。

回答

我们在会话外观中使用AOP为客户自定义应用程序提供一致的框架。这使我们可以公开自定义的一点,而不必为每种方法添加手动挂钩支持。

此外,AOP提供了一个单点配置,用于进行其他事务设置和拆卸以及通常的日志记录。总而言之,比手工完成所有工作更具可维护性。

回答

我不了解人们如何在不使用AOP的情况下如何处理日志,安全性,事务管理,异常处理等跨领域问题。

使用Spring框架的任何人(大约50%的Java企业开发人员)都在使用AOP,无论他们是否知道。

回答

我工作的主要应用程序包括一个脚本宿主。 AOP允许主机在决定是否将脚本加载到应用程序域之前检查脚本的属性。由于某些脚本非常繁琐,因此可以在运行时更快地加载。

我们还计划将大量属性用于(例如)编译器控制,流控制和IDE调试中,而这些属性不必成为最终分布式应用程序的一部分。

回答

我们将PostSharp用于我们的AOP解决方案。我们拥有当前使用的缓存,错误处理和数据库重试方面,并且正在使我们的安全检查成为方面。

对我们很有用。开发人员确实很喜欢分离关注点。架构师真的很喜欢将平台级逻辑整合到一个位置。

PostSharp库是一个后编译器,用于注入代码。它具有预定义的拦截库,这些拦截器容易死掉。感觉就像在事件处理程序中进行接线。