我的理解是 把系统性的编程工作封装起来 =》我给这个取个名字叫 “Aspect”,然后通过AOP技术把它切进我们的业务逻辑代码 =》 “业务“

这样的好处:

“Aspect” 和 “业务” 相互独立,既可以让“业务” 用到了 “Aspect” 又让2者互相独立不耦合,多个“业务”也能复用 同一份“Aspect”

举一个最实用的例子 Transaction 事物

我们经常会在业务代码上使用Transaction事物,比如使用TransactionScope:

下面的测试代码用到了我在维护的一个开源ORM框架

https://github.com/yuzd/AntData.ORM

示例业务代码:

上面的代码 就是 插入一个学校到db 然后拿到主键 赋值给 person 再insert到db。在同一个事物里面 要么school 和person 同时插入db 要么都失败。

实际业务代码肯定比这个要复杂的多了,比如多个方法在一个事物里面等我这里就举最简单的例子。

那么如果每段业务逻辑都这么写的话 会造成重复性代码很多,下面我们就尝试用AOP面向对切的思想去优化

思考怎样的方式才是我想要的

示例代码:

如上图:我在需要用到事物的方法上面打了一个 EnableTransactionScope 标签 这样遇到业务方法需要用事物包裹的话 都可以打上这个标签

假如要实现这样的话 得实现以下几点:

  1. 我需要代理类,因为只有代理类才能给业务代码做些手脚(织入我们想要的逻辑包裹)

  2. 我需要一个DI容器,因为将实例的生成交给DI容器了会很方面的生成代理类

  3. 我希望只是打打标签就能实现以上这些,这样可视化最好,也方便

朝着目标去实现它 Just Do It

这2个库都是autofac旗下现成的开源产品,有了这2个库 就满足我上面提到的需求1和需求2

第3点看来得亲自动手了

????~~

Autofac.Annotation组件诞生

这个组件是我维护的一个开源的autofac扩展库,用来实现打打标签 就能实现一些复杂的配置!

2. 如何使用 Autofac.Annotation 帮助实现AOP面向切面编程

先简单来个示例代码:

更多示例请查阅:https://github.com/yuzd/Autofac.Annotation

3. 使用织入来实现TransactionScope切面

新建一个class如下继承PointcutAttribute 并实现方法:注意:由于是异步环境 必须使用 new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)

只需要在在需要事物包裹的方法上打上这个标签 [EnableTransactionScope] 如下图:

点我查看以上代码

总结

使用Autofac.Annotation组件可以很方便的让我们在业务代码中使用AOP切面,可以自定义实现切入的位置(前置,后置,还是Arround等)

参考上面代码,

  • 打了Componet标签就把类注入到autofac容器了

  • 打了Aspect标签就代表该类需要autofac帮我生成代理类

  • 方法上面打了指定的标签(前置,后置,环绕,PointCut四种)代表要织入的逻辑

织入类型 实现规则 说明
前置织入 继承AspectBeforeAttribute 在进入业务代码之前先执行【前置织入逻辑-》业务代码】
后置织入 继承AspectAfterAttribute 在业务代码执行之后执行(即使有异常)【业务代码-》后置织入逻辑】
环绕织入 继承AspectAroundAttribute 在业务代码之前和之前都执行【前置织入逻辑-》业务代码-》后置织入逻辑】
PointCut织入 继承PointcutAttribute 掌控业务代码的执行权,这种最灵活【本文的TransactionScope功能就得用到它】

一个开源的 netcore mvc role management 快速开发系统(菜单,角色,权限[精确到按钮])

原文链接:https://www.cnblogs.com/yudongdong/p/11609262.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Autofac的AOP面向切面编程研究相关推荐

  1. 切面是异步还是同步操作‘_Autofac的AOP面向切面编程研究

    什么是AOP: 我的理解是 把系统性的编程工作封装起来 =>我给这个取个名字叫 "Aspect",然后通过AOP技术把它切进我们的业务逻辑代码 => "业务& ...

  2. AOP(面向切面编程)大概了解一下

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 1. 概述 在软件业, ...

  3. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  4. AOP—面向切面编程

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 概述 在软件业,AOP ...

  5. java aop面向切面编程

    最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...

  6. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析

    文章目录 一.查看使用 AspectJ 后生成的 Class 字节码类 二.AspectJ 的本质 一.查看使用 AspectJ 后生成的 Class 字节码类 在 Android Studio 中查 ...

  7. 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )

    文章目录 一.AspectJ 下载 二.拷贝 aspectjrt.jar 到 Android Studio 三.配置 Gradle 和 Gradle 插件版本 四.配置 Gradle 构建脚本 一.A ...

  8. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )

    文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...

  9. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中"通知"是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在j ...

最新文章

  1. python学习 第七篇 sql优化
  2. 知识点041-Samba 的安装
  3. 基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换
  4. macOS 10.14 mojave安装低版本iTunes 12.6.x
  5. 将权限组件应用到新项目
  6. 前端学习(2650):composition组件
  7. iangularjs 模板,AngularJS模板中的三元运算符
  8. 八年程序员被裁了后,打脸上家公司,连斩六个offer
  9. Python调用seek(pos,mode)方法报错Can‘t do nonzero cur-relative seeks
  10. python selenium环境安装及配置_selenium环境配置
  11. find命令过滤 no such_Linux中find命令的用法入门
  12. python文本文件合并_使用python将2个文本文件合并为一个文件 - python
  13. 机器学习不是你想用,想用就能用
  14. Springboot搭建文件服务器
  15. 万字好文,手把手教你做一个「vue3+express+typescript」的全栈模板项目
  16. 对待员工的4个阶段:我如何让员工过好自己的一生?
  17. Carsim2016及2019 轨迹跟踪过程中跑直线的解决方案
  18. 与君共品代码: Spelling Corrector
  19. 会议室可以使用全彩LED显示屏吗?
  20. c#winform如何获取服务器指定文件夹中所有的文件信息,winform 读取某个目录下的所有图片并显示到pictureBox 附完整源码...

热门文章

  1. Android 横竖屏切换的处理 (转载)
  2. input 禁用智能提示_如何在智能手机上禁用紧急警报
  3. LeetCode 366. Find Leaves of Binary Tree
  4. Keras版Faster-RCNN代码学习(IOU,RPN)1
  5. bondat蠕虫传播与对抗
  6. 抽象工厂模式(Absraact Factory)介绍与实现
  7. 编码之道:取个好名字很重要
  8. 编码GBK的不可映射字符
  9. github开源推荐:SuperSocket, 可扩展的 Socket 服务器框架
  10. Abp太重了?轻量化Abp框架