Autofac的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?標簽 這樣遇到業務方法需要用事物包裹的話 都可以打上這個標簽
假如要實現這樣的話 得實現以下幾點:
我需要代理類,因為只有代理類才能給業務代碼做些手腳(織入我們想要的邏輯包裹)
我需要一個DI容器,因為將實例的生成交給DI容器了會很方面的生成代理類
我希望只是打打標簽就能實現以上這些,這樣可視化最好,也方便
朝著目標去實現它 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面向切面编程研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET生成漂亮桌面背景
- 下一篇: 计算机网络原理梳理丨清晰认识 TCP/I