Autofac的AOP面向切面编程研究

老子叫甜甜 提交于 2019-11-30 22:31:04

什么是AOP:

我的理解是 把系统性的编程工作封装起来 =》我给这个取个名字叫 “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

1. 使用Autofac 这款DI容器 配合 Autofac.Extras.DynamicProxy 库

这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功能就得用到它】

使用Autofac.Annotation组件案例

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


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢

http://market.szonline.net/amaz/15118.html
http://market.szonline.net/amaz/15117.html
http://market.szonline.net/amaz/15116.html
http://market.szonline.net/amaz/15114.html
http://market.szonline.net/amaz/15113.html
http://market.szonline.net/amaz/15111.html
http://market.szonline.net/amaz/15109.html
http://market.szonline.net/amaz/15107.html
http://market.szonline.net/amaz/15106.html
http://market.szonline.net/amaz/15104.html
http://market.szonline.net/amaz/15102.html
http://market.szonline.net/amaz/15100.html
http://market.szonline.net/amaz/15099.html
http://market.szonline.net/amaz/15097.html
http://market.szonline.net/amaz/15095.html
http://market.szonline.net/amaz/15093.html
http://market.szonline.net/amaz/15092.html
http://market.szonline.net/amaz/15090.html
http://market.szonline.net/amaz/15088.html
http://market.szonline.net/amaz/15086.html
http://market.szonline.net/amaz/15085.html
http://market.szonline.net/amaz/15083.html
http://market.szonline.net/amaz/15081.html
http://market.szonline.net/amaz/15079.html
http://market.szonline.net/amaz/15078.html
http://market.szonline.net/amaz/15076.html
http://market.szonline.net/amaz/15074.html
http://market.szonline.net/amaz/15072.html
http://market.szonline.net/amaz/15071.html
http://market.szonline.net/amaz/15069.html
http://market.szonline.net/amaz/15067.html
http://market.szonline.net/amaz/15065.html
http://market.szonline.net/amaz/15064.html
http://market.szonline.net/amaz/15018.html
http://market.szonline.net/amaz/15016.html
http://market.szonline.net/amaz/15013.html
http://market.szonline.net/amaz/15010.html
http://market.szonline.net/amaz/15008.html
http://market.szonline.net/amaz/15006.html
http://market.szonline.net/amaz/15003.html
http://market.szonline.net/amaz/15000.html
http://market.szonline.net/amaz/14998.html
http://market.szonline.net/amaz/14996.html
http://market.szonline.net/amaz/14993.html
http://market.szonline.net/amaz/14988.html
http://market.szonline.net/amaz/14986.html
http://market.szonline.net/amaz/14984.html
http://market.szonline.net/amaz/14981.html
http://market.szonline.net/amaz/14978.html
http://market.szonline.net/amaz/14976.html
http://market.szonline.net/amaz/14974.html
http://market.szonline.net/amaz/14971.html
http://market.szonline.net/amaz/14968.html
http://market.szonline.net/amaz/14966.html
http://market.szonline.net/amaz/14964.html
http://market.szonline.net/amaz/14961.html
http://market.szonline.net/amaz/14958.html
http://market.szonline.net/amaz/14956.html
http://market.szonline.net/amaz/14954.html
http://market.szonline.net/amaz/14951.html
http://market.szonline.net/amaz/14948.html
http://market.szonline.net/amaz/14946.html
http://market.szonline.net/amaz/14944.html
http://market.szonline.net/amaz/14941.html
http://market.szonline.net/amaz/14938.html
http://market.szonline.net/amaz/14936.html
http://market.szonline.net/amaz/14934.html
http://market.szonline.net/amaz/14931.html
http://market.szonline.net/amaz/14928.html
http://market.szonline.net/amaz/14926.html
http://market.szonline.net/amaz/14924.html
http://market.szonline.net/amaz/14921.html
http://market.szonline.net/amaz/14918.html
http://market.szonline.net/amaz/14916.html
http://market.szonline.net/amaz/14914.html
http://market.szonline.net/amaz/14911.html
http://market.szonline.net/amaz/14908.html
http://market.szonline.net/amaz/14906.html
http://market.szonline.net/amaz/14904.html
http://market.szonline.net/amaz/14901.html
http://market.szonline.net/amaz/14898.html
http://market.szonline.net/amaz/14896.html
http://market.szonline.net/amaz/14894.html
http://market.szonline.net/amaz/14891.html

什么是AOP:

我的理解是 把系统性的编程工作封装起来 =》我给这个取个名字叫 “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

1. 使用Autofac 这款DI容器 配合 Autofac.Extras.DynamicProxy 库

这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功能就得用到它】

使用Autofac.Annotation组件案例

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!