在我看来,AOP是一个有趣的编程范例.但是,目前还没有关于stackoverflow的讨论(至少我找不到它们).你对此有何看法?你在项目中使用AOP吗?或者你认为它是一种利基技术,不会长时间存在或者不会成为主流(就像OOP一样,至少在理论上会这样做))?
如果您确实使用AOP,请告诉我们您使用的工具.谢谢!
Python支持AOP,允许您在运行时动态修改其类(在Python中通常称为monkeypatching而不是AOP).以下是我的一些AOP用例:
我有一个网站,其中每个页面都是由Python函数生成的.我想上课,让该课程生成的所有网页都受密码保护.AOP来救援; 在调用每个函数之前,我会根据需要进行适当的会话检查和重定向.
我希望在实际使用过程中对我的程序中的一些函数进行一些日志记录和分析.AOP允许我计算时间和打印数据到日志文件而不实际修改任何这些功能.
我有一个充满非线程安全函数的模块或类,我发现自己在一些多线程代码中使用它.一些AOP在这些函数调用周围添加了锁定,而无需进入库并进行任何更改.
这种事情并不常见,但每当它发生时,monkeypatching非常有用.Python同时实现了这个装饰设计模式(装饰http://en.wikipedia.org/wiki/Decorator_pattern)来完成类似的事情.
需要注意的是,动态地修改类也可以让你解决错误或添加功能的第三方库,而不必实际修改库.我几乎从不需要这样做,但是它出现的次数非常有用.
是.
正如安全性一样,正交问题最好用AOP风格的拦截来完成.这是自动完成(通过依赖注入容器之类的东西)还是手动完成对于最终目标而言并不重要.
一个例子:xUnit.net(我运行的一个开源项目)中的"before/after"属性是一种AOP风格的方法拦截.您使用这些属性修饰测试方法,并且在该测试方法运行之前和之后,调用您的代码.它可用于设置数据库和回滚结果,更改运行测试的安全上下文等.
另一个例子:ASP.NET MVC中的过滤器属性也像专门的AOP样式方法拦截器一样.例如,一个允许您说明如何处理未处理的错误,如果它们发生在您的操作方法中.
许多依赖注入容器,包括Castle Windsor和Unity,都支持"在框中"或通过使用扩展这种行为.
我不明白如何在不使用AOP的情况下以干净的方式处理日志记录,安全性,事务管理,异常处理等跨领域问题.
任何使用Spring框架的人(可能大约有50%的Java企业开发人员)都在使用AOP,无论他们是否知道.