上个月月底刚完成一个web项目,这个项目一期和二期一共花1年左右时间,跨度达3年之久;3年之中共参与了2个web项目和2个C/S项目,都没有时间空闲下来总结下东西。最近在整理一个项目的需求,之间要反复评审所以可以腾出来一些时间,想把一些积累都整理下。(CSDN的BLOG不敢恭维经常写一大段保存时候程序出问题,没有拷贝还得重新写!)这段时间已经整理出一个轻量级的ORM,下个项目准备使用castle的AOP(aspect#),所以这段时间把AOP的资料整清楚.
AOP是aspect oriented programming的缩写,是面向方面的思想. 那什么是面向方面?它主要运用在什么领域呢?我们已经对面向过程和面向对象(OOP)已经非常耳熟了,从面向过程到面向对象是一种飞跃;我们可以用面向对象思想取代以前的面向过程的思想,但从面向对象发展到面向方面,不是一种取代而是一种补充.面向对象最重要的作用就是解耦,一个系统中用面向对象思想可以解决大部分的东西,但还有一些点和面还不能用OOP(面向对象)来解决,而AOP可以解决OOP不好处理的角落和方面,所以AOP决不是OOP的代替品,是OOP的一种强力补充.
一、面向方面剖析
在面向对象中我们把重点放在对象上,当然面向方面要在'方面'上做文章.面向方面就是要我们只关注方面,比如有一个需求,我们把它分解成几个方面,包括主业务方面和其他辅助方面;这样在构架某个方面时只专注于该方面,不用在乎其他方面的内容;每个方面都独立钩架清楚了我们再通过AOP框架把它们整合起来.使用AOP能大幅度地降低了各个方面的耦合程度,使在设计各个模块(方面)时能更加高效独立,结构更清晰.举个例子:
我们要做个文章管理系统,传统的做法可以分解成几个模块:文章登记管理主业务功能和日志管理及权限管理;日志管理和权限不相关的话可以独立处理,但处理主业务功能时就要参合日志管理和权限管理,这样模块之间的耦合就非常紧密,如下图:
上图,在设计主业务功能时就要涉及日志管理和权限管理,造成主业务功能模块比较混乱,结构不清晰.以此类推:如果其他模块也相互使用和依赖的话,那模块设计时不只考虑本模块的因素还要考虑其他模块的因素,就变得很复杂了!
当我们引入并使用AOP后,把这个系统分解成三个方面:主业务功能方面(主方面) 日志管理方面和权限管理方面(后面两个是辅助方面).在设计及处理的时候我们可以把这三个方面分配三个不同处理,每个人只需要关心自己方面的内容而不用担心其他方面对他的影响,所有方面都是独立设计的!最后通过AOP框架把这些方面组合起来,满足系统需求.
上图看出, 每个方面都可以独立处理,然后通过AOP把这些方面联系起来.这方式最后生成的系统与传统的做法最后生成系统是一样,但AOP中每个模块的设计更加独立 耦合小 结构清晰 业务处理也很清楚.
二、主要应用领域及用途
目前AOP应用比较多的是在日志管理、权限管理、数据同步和其他业务管理引擎方面;之前我接触的工作流比较多,对这方面的东西比较有经验了,去年设计了这个工作流引擎组件,后来发现如果在这个组件里应用AOP技术相关引伸出来的思想或者技术会非常理想的(这个组件准备这几个月把它完善起来)!所以可以看出AOP应用还是比较广泛的,不仅仅局限于它本身的应用,还可以从其相关应用技术引伸出来思想的使用。
三、AOP相关技术领域
实现AOP思想技术有好几种,目前比较流行的是动态代理和静态织入。静态织入就是在程序编译时把辅助方面的业务关系直接插入到主业务方面代码里面,我认为这种技术将来一定会比较流行的,但现在用这个实现的少(目前好象也不好实现);动态代理是在运行时产生一个 代码类来代理处理各个方面的关系,dotnet现在大多数AOP框架都用这个,比如:sprint.net的AOP框架和castle中的AOP框架(aspect#)都是以动态代理为基础来实现AOP的。后面的文章会持续分析CASTLE的AOP的原理及其使用。
四、总结
这几年框架使用比较多是MVC、ORM、IOC。但AOP还没被广泛使用,很多人都持观望态度;通过这几年的发展AOP框架在不断完善,也逐渐得到认可,其思想和技术也不断延伸。AOP是一种很好的技术和思想,即使你现在不想使用这种框架,了解AOP对你的程序构架也有莫大的好处!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/puny/archive/2007/05/26/1627084.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述