本文转载https://www.cnblogs.com/OlderGiser/p/9992920.html
1.存在问题
最近,其它项目小组在开发的过程中遇到了一个问题,在日志记录时,用户明明点击的是更新操作,可翻看记录时却发现是查询操作,起初是一头雾水,后面跟踪该更新操作的代码后才发现,在日志记录时确实是写着查询,说到这里,大家可能已经知道问题的所在了,这是由于在开发的过程中,开发员直接从查询的方法里把日志记录的代码直接copy过来,而后面又忘记修改,相信其它的方法里也同样是存在这样的问题。
在平常的开发过程中,日志往往采取如下图的编程方式,在小项目中这种方法简单快捷,没有太大的问题,但对于比较大的项目,这样重复的代码会造成后期的维护成本比较高的,万一哪天说日志记录要换换格式或采用第三方库,估计就蛋疼了。
问题是发现了,有没有改进的方法呢?答案是肯定的。这个时候AOP该闪亮登场了,第一次学习【老张的哲学】系统文章时,也没怎么注意到AOP这个知识点,当时就懵懵懂懂,可后面发现在很多的开源框架里都有涉及到AOP的概念,所以借此机会自己也学习一下,时机成熟时也可以引入到项目里。
2.AOP的概念
AOP是Aspect Oriented Programing的缩写,中文翻译为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从面使得业务逻辑各部分之间的耦合度低,提高程序的可重用性,同时提高开发的效率。
通俗的讲:面向切面编程是在不影响原有功能的前提下,可为软件横向扩展,即可插拔,拔掉软件正常运行,插上扩展功能起效果。
3.AOP应用范围
既然把AOP说得那么厉害,那它到底可以用到哪些地方呢?
- 日记功能
- 审计功能
- 验证功能
- 安全控制
- 事务处理
- 异常处理
- ......
3.AOP实现方式
在.net core中,AOP的实现可以通过以下三种试:
过滤器(Filter):适用于身份验证、参数验证、处理耗时的Web服务
动态代理(DynamicProxy):适用功能模块间的解耦和重用
中间件(Middleware):适用底层服务的通信
主要框架有:
编译时:PostSharp、LinFu、SheepAspect、Fody、CIL
运行时:Castle Windsor、StructureMap、Unity、Spring.NET
4.应用举例
在本文中主要利用PostSharp实现AOP例子,PostSharp是一个在.net平台上实现的AOP框架,是一个收费的框架。好拉,下面将利用PostSharp解决开篇提到的问题,通过AOP为系统添加日志记录功能。
步骤一:新建项目FirstAOP,并添加PostShap
步骤二:定义LogOperator日志记录类,并继承OnMethodBoundaryAspect
步骤三:将LogOperator切面以特性的形式添加到Main函数中
步骤四:运行,可以看到日志已经成功开启