在生产软件中使用AOP(面向方面编程)吗?
在我看来, AOP是一个有趣的编程范例。 不过,在这里还没有讨论过它(至less我找不到它们)。 你怎么看待这个问题? 你在项目中使用AOP吗? 或者你认为这是一个相当长的技术,不会长期存在或不会成为主stream(至less在理论上,就像OOP一样))?
如果您确实使用AOP,请告诉我们您使用的工具。 谢谢!
是。
像安全性这样的正交关注最好是用AOP风格的截取来完成。 无论是自动完成(通过dependency injection容器)还是手动完成对最终目标都不重要。
举个例子: xUnit.net (我运行的一个开源项目)中的“before / after”属性是一种AOP风格的方法拦截。 你用这些属性修饰你的testing方法,在testing方法运行之前和之后,调用你的代码。 它可以用于设置数据库和回滚结果,更改testing运行的安全上下文等。
另一个例子: ASP.NET MVC中的filter属性也像专门的AOP风格的方法拦截器一样。 举个例子,你可以说如何处理未处理的错误,如果它们发生在你的行动方法中。
许多dependency injection容器,包括Castle Windsor和Unity,都支持“在框中”或通过使用扩展。
Python支持AOP,让你在运行时dynamic修改它的类(在Python中通常被称为monkeypatching而不是AOP)。 以下是我的一些AOP用例:
-
我有一个网站,每个页面都是由Python函数生成的。 我想参加一个class级,并使所有由该class级生成的网页受密码保护。 AOP来救援; 在每个函数被调用之前,我会进行适当的会话检查并在必要时redirect。
-
我想在实际使用过程中对程序中的一些函数进行日志logging和分析。 AOP让我计算时间和打印数据来logging文件,而不需要实际修改任何这些function。
-
我有一个充满非线程安全function的模块或类,我发现自己在一些multithreading代码中使用它。 一些AOP增加了对这些函数调用的locking,而不必进入库并改变任何东西。
这种东西不是经常出现,但是每当它出现时,monkeypatching是非常有用的。 Python也有装饰器实现装饰devise模式( http://en.wikipedia.org/wiki/Decorator_pattern )来完成类似的事情。
请注意,dynamic修改类也可以让您解决错误或向第三方库添加function,而无需实际修改该库。 我几乎从来不需要这样做,但是几次出现,这是非常有用的。
我不明白如何在不使用AOP的情况下以一种干净的方式处理日志,安全,事务pipe理,exception处理等交叉问题。
任何使用Spring框架的人(可能大约有50%的Java企业开发人员)正在使用AOP,不pipe他们是否知道。
在兵马俑,我们使用AOP和字节码仪器相当广泛的集成和仪器第三方软件。 例如,我们的Spring 集成很大程度上是通过使用aspectwerkz来完成的 。 简而言之,我们需要拦截对Spring bean和bean工厂的调用,以便对它们进行聚类。
所以AOP可以用于集成不能被修改的第三方代码。 然而,我们发现有一个巨大的陷阱 – 如果可能的话,只能在你的连接点使用第三方的公共API,否则你可能会冒险让你的代码在下一个次要版本中被一些私有方法改变而中断,维护噩梦。
AOP和交易分界是天上的一场比赛。 我们使用Spring AOP @Transaction注释,这使得比其他任何地方都更容易和更直观的TX划分。
在我的一个大项目中,我们使用了aspectJ很长一段时间。 该项目由几个Web服务组成,每个Web服务都有几个function,这是一个复杂的文档处理/查询系统的前端。 大约75k行代码。 我们使用了两个相对较小的function。
首先是追踪应用程序stream程。 我们创build了一个在每个函数调用之前和之后运行的方面,以打印出“进入”函数“”和“退出”函数“”。 用函数select器的东西(切入点也许?我不记得正确的名字),我们可以使用这个作为debugging工具,只select我们想要在给定时间跟踪的函数。 这在我们的项目中是非常好的用途。
我们做的第二件事是特定于应用程序的指标。 我们在Web服务方法中添加了一些方面来捕获时间,对象信息等,并将结果转储到数据库中。 这很好,因为我们可以捕获这些信息,但是仍然把所有的捕获代码与执行工作的“真实”代码分开。
我已经读过一些方面可以带来的好的解决scheme,但是我仍然不相信他们可以用“正常”的技术来做任何你无法做到的事情(或许更好)。 例如,我想不出任何主要的function或function,我们的任何项目所需要的,没有方面也不能轻松完成 – 我发现在这些方面有用的是我提到过的那些小事。
我在我的C#应用程序中大量使用AOP。 我不喜欢使用属性,所以我使用Castle DynamicProxy和Boo来在运行时应用方面而不会污染我的代码
我们在会话外观中使用AOP为我们的客户提供一致的框架来定制我们的应用程序。 这使我们可以公开一个定制点,而不必为每个方法添加手动钩子支持。
此外,AOP为额外的交易设置和拆卸提供了单点configuration,并提供了常用的日志loggingfunction。 总而言之,比手工完成所有这些工作更可维护。
我工作的主要应用程序包括一个脚本宿主。 AOP允许主机在决定是否将脚本加载到应用程序域之前检查脚本的属性。 由于一些脚本非常麻烦,这使得在运行时加载更快。
我们还使用并计划使用大量属性,如编译器控制,stream控制和in-IDEdebugging等,这些属性不需要成为最终分布式应用程序的一部分。
我们使用PostSharp作为我们的AOP解决scheme。 我们有caching,error handling和数据库重试方面,我们目前正在使用,并且正在使我们的安全检查成为一个方面。
对我们很好。 开发人员确实喜欢分离关注点。 架构师确实喜欢将平台级逻辑整合到一个位置。
PostSharp库是一个后期编译器,用于注入代码。 它有一个预先定义的拦截库,它们很容易实现。 感觉像事件处理程序中的接线。