Autofac的AOP面向切面編程研究

什麼是AOP:

個人理解是 把系統性的編程工做封裝起來 =》我給這個取個名字叫 「Aspect」,而後經過AOP技術把它切進咱們的業務邏輯代碼 =》 「業務「html

這樣的好處:

「Aspect」 和 「業務」 相互獨立,既可讓「業務」 用到了 「Aspect」 又讓2者互相獨立不耦合,多個「業務」也能複用 同一份「Aspect」git

舉一個最實用的例子 Transaction 事物

咱們常常會在業務代碼上使用Transaction事物,好比使用TransactionScope:github

下面的測試代碼用到了我在維護的一個開源ORM框架編程

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

示例業務代碼:框架

image

上面的代碼 就是 插入一個學校到db 而後拿到主鍵 賦值給 person 再insert到db。 在同一個事物裏面 要麼school 和person 同時插入db 要麼都失敗。異步

實際業務代碼確定比這個要複雜的多了,好比多個方法在一個事物裏面等我這裏就舉最簡單的例子。post

那麼若是每段業務邏輯都這麼寫的話 會形成重複性代碼不少,下面咱們就嘗試用AOP面向對切的思想去優化測試

思考怎樣的方式纔是我想要的

示例代碼:優化

image

如上圖: 我在須要用到事物的方法上面打了一個 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面向切面編程

先簡單來個示例代碼:

image

image

image

更多示例請查閱:https://github.com/yuzd/Autofac.Annotation

3. 使用織入來實現TransactionScope切面

 

新建一個class以下繼承PointcutAttribute 並實現方法: 注意:因爲是異步環境 必須使用 new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)

image

只須要在在須要事物包裹的方法上打上這個標籤 [EnableTransactionScope] 以下圖:

image

點我查看以上代碼

總結

使用Autofac.Annotation組件能夠很方便的讓咱們在業務代碼中使用AOP切面,能夠自定義實現切入的位置(前置,後置,仍是Arround等)

參考上面代碼,

  • 打了Componet標籤就把類注入到autofac容器了
  • 打了Aspect標籤就表明該類須要autofac幫我生成代理類
  • 方法上面打了指定的標籤(前置,後置,環繞,PointCut四種)表明要織入的邏輯
織入類型 實現規則 說明
前置織入 繼承AspectBeforeAttribute 在進入業務代碼以前先執行【前置織入邏輯-》業務代碼】
後置織入 繼承AspectAfterAttribute 在業務代碼執行以後執行(即便有異常)【業務代碼-》後置織入邏輯】
環繞織入 繼承AspectAroundAttribute 在業務代碼以前和以前都執行【前置織入邏輯-》業務代碼-》後置織入邏輯】
PointCut織入 繼承PointcutAttribute 掌控業務代碼的執行權,這種最靈活【本文的TransactionScope功能就得用到它】

使用Autofac.Annotation組件案例

一個開源的 netcore mvc role management 快速開發系統(菜單,角色,權限[精確到按鈕])

若是您以爲閱讀本文對您有幫助,請點一下「推薦」按鈕,您的「推薦」將是我最大的寫做動力!歡迎各位轉載,轉載文章以後須在文章頁面明顯位置給出做者和原文鏈接,謝謝
相關文章
相關標籤/搜索