AOP 是我认为很有趣的编程范式。然而,在 stackoverflow 上还没有关于它的讨论(至少我找不到)。你们对此有什么看法?在项目中是否使用 AOP?或者您认为它是一个小众技术,不会存在很长时间或不会进入主流(像 OOP 一样,在理论上至少 ;))?
如果您确实使用 AOP,请告知您使用的工具。 谢谢!
Python支持AOP,通过在运行时动态修改其类(在Python中通常称为猴子补丁而不是AOP)。以下是一些使用AOP的用例:
我有一个网站,其中每个页面都是由一个Python函数生成的。我想将一个类的所有生成的网页设置为需要密码保护。AOP来拯救;在调用每个函数之前,我进行适当的会话检查,并在必要时进行重定向。
我想在程序的实际使用过程中对一堆函数进行日志记录和性能分析。AOP允许我计算时间并将数据打印到日志文件中,而无需实际修改任何这些函数。
我有一个模块或类充满了不支持多线程的函数,在某些多线程代码中使用它。一些AOP在这些函数调用周围添加锁定,而无需进入库并更改任何内容。
这种情况并不经常发生,但每当出现时,猴子补丁非常有用。Python还有装饰器,实现装饰者模式(http://en.wikipedia.org/wiki/Decorator_pattern)以实现类似的功能。
请注意,动态修改类还可以让您解决第三方库中的错误或添加功能,而无需实际修改该库。我几乎从不需要这样做,但出现过几次,这非常有用。
是的。
针对安全等方面的正交问题,最好采用AOP(面向切面编程)拦截。无论是自动完成(通过依赖注入容器之类的东西)还是手动完成,对于最终目标来说都不重要。
例如,在我管理的开源项目xUnit.net中,“before/after”属性就是一种AOP-style方法拦截的形式。您可以使用这些属性装饰测试方法,在测试方法运行之前和之后调用您的代码。它可用于设置数据库并回滚结果、更改测试运行时的安全上下文等方面。
另一个例子是ASP.NET MVC中的过滤器属性,也像专门的AOP-style方法拦截器。例如,其中一个允许您指定在操作方法中发生未处理错误时应如何处理。
许多依赖注入容器,包括Castle Windsor和Unity,都支持此行为,无论是“内置”还是通过扩展实现。
我不明白如何在不使用AOP的情况下,以干净的方式处理像日志记录、安全性、事务管理、异常处理等交叉关注点。
任何使用Spring框架(可能约占Java企业开发人员的50%)的人都在使用AOP,无论他们是否知道。
Log([arguments])
到底有什么不规范的地方吗?它会带来哪些问题? - PacerierAOP和事务划分是天作之合。我们使用Spring AOP @Transaction注释,它比我在其他任何地方看到的都更容易和直观地进行事务划分。
我们在会话门面中使用AOP来为我们的客户提供一个一致的框架来定制我们的应用程序。这样可以使我们暴露一个单一的定制点,而不必为每个方法添加手动挂接支持。
此外,AOP为其他事务设置和拆卸以及通常的日志记录等提供了单一的配置点。总体而言,比手动完成所有这些工作要更易于维护。
我们使用PostSharp作为我们的AOP解决方案。我们目前使用缓存、错误处理和数据库重试方面,并正在将我们的安全检查作为一个Aspect。
对我们来说非常好用。开发人员真的很喜欢关注点分离。架构师们真的很喜欢在一个位置上集中平台级别的逻辑。
PostSharp库是一个后编译器,它进行代码注入。它有一个预定义的拦截库,非常容易实现。感觉就像是连接事件处理程序一样简单。
我在我的C#应用程序中频繁使用AOP。我不太喜欢使用属性,因此我使用了Castle DynamicProxy和Boo,在运行时应用Aspect而不污染我的代码。