切面是异步还是同步操作‘_Autofac的AOP面向切面编程研究
什么是AOP:
我的理解是 把系統(tǒng)性的編程工作封裝起來 =》我給這個(gè)取個(gè)名字叫 “Aspect”,然后通過AOP技術(shù)把它切進(jìn)我們的業(yè)務(wù)邏輯代碼 =》 “業(yè)務(wù)“
這樣的好處:
“Aspect” 和 “業(yè)務(wù)” 相互獨(dú)立,既可以讓“業(yè)務(wù)” 用到了 “Aspect” 又讓2者互相獨(dú)立不耦合,多個(gè)“業(yè)務(wù)”也能復(fù)用 同一份“Aspect”
舉一個(gè)最實(shí)用的例子 Transaction 事物
我們經(jīng)常會(huì)在業(yè)務(wù)代碼上使用Transaction事物,比如使用TransactionScope:
下面的測試代碼用到了我在維護(hù)的一個(gè)開源ORM框架
https://github.com/yuzd/AntData.ORM
示例業(yè)務(wù)代碼:
上面的代碼 就是 插入一個(gè)學(xué)校到db 然后拿到主鍵 賦值給 person 再insert到db。 在同一個(gè)事物里面 要么school 和person 同時(shí)插入db 要么都失敗。
實(shí)際業(yè)務(wù)代碼肯定比這個(gè)要復(fù)雜的多了,比如多個(gè)方法在一個(gè)事物里面等我這里就舉最簡單的例子。
那么如果每段業(yè)務(wù)邏輯都這么寫的話 會(huì)造成重復(fù)性代碼很多,下面我們就嘗試用AOP面向?qū)η械乃枷肴?yōu)化
思考怎樣的方式才是我想要的
示例代碼:
如上圖: 我在需要用到事物的方法上面打了一個(gè) EnableTransactionScope 標(biāo)簽 這樣遇到業(yè)務(wù)方法需要用事物包裹的話 都可以打上這個(gè)標(biāo)簽
假如要實(shí)現(xiàn)這樣的話 得實(shí)現(xiàn)以下幾點(diǎn):
朝著目標(biāo)去實(shí)現(xiàn)它 Just Do It
1. 使用Autofac 這款DI容器 配合 Autofac.Extras.DynamicProxy 庫
這2個(gè)庫都是autofac旗下現(xiàn)成的開源產(chǎn)品,有了這2個(gè)庫 就滿足我上面提到的需求1和需求2
第3點(diǎn)看來得親自動(dòng)手了
~~
Autofac.Annotation組件誕生
這個(gè)組件是我維護(hù)的一個(gè)開源的autofac擴(kuò)展庫,用來實(shí)現(xiàn)打打標(biāo)簽 就能實(shí)現(xiàn)一些復(fù)雜的配置!
2. 如何使用 Autofac.Annotation 幫助實(shí)現(xiàn)AOP面向切面編程
先簡單來個(gè)示例代碼:
更多示例請查閱:https://github.com/yuzd/Autofac.Annotation
3. 使用織入來實(shí)現(xiàn)TransactionScope切面
新建一個(gè)class如下繼承PointcutAttribute 并實(shí)現(xiàn)方法: 注意:由于是異步環(huán)境 必須使用 new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)
只需要在在需要事物包裹的方法上打上這個(gè)標(biāo)簽 [EnableTransactionScope] 如下圖:
點(diǎn)我查看以上代碼
總結(jié)
使用Autofac.Annotation組件可以很方便的讓我們在業(yè)務(wù)代碼中使用AOP切面,可以自定義實(shí)現(xiàn)切入的位置(前置,后置,還是Arround等)
參考上面代碼,
- 打了Componet標(biāo)簽就把類注入到autofac容器了
- 打了Aspect標(biāo)簽就代表該類需要autofac幫我生成代理類
- 方法上面打了指定的標(biāo)簽(前置,后置,環(huán)繞,PointCut四種)代表要織入的邏輯
織入類型實(shí)現(xiàn)規(guī)則說明前置織入繼承AspectBeforeAttribute在進(jìn)入業(yè)務(wù)代碼之前先執(zhí)行【前置織入邏輯-》業(yè)務(wù)代碼】后置織入繼承AspectAfterAttribute在業(yè)務(wù)代碼執(zhí)行之后執(zhí)行(即使有異常)【業(yè)務(wù)代碼-》后置織入邏輯】環(huán)繞織入繼承AspectAroundAttribute在業(yè)務(wù)代碼之前和之前都執(zhí)行【前置織入邏輯-》業(yè)務(wù)代碼-》后置織入邏輯】PointCut織入繼承PointcutAttribute掌控業(yè)務(wù)代碼的執(zhí)行權(quán),這種最靈活【本文的TransactionScope功能就得用到它】
作者:魚東東;出處:https://www.cnblogs.com/yudongdong/p/11609262.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的切面是异步还是同步操作‘_Autofac的AOP面向切面编程研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断long类型是否为空_数据类型
- 下一篇: qt显示rgba8888 如何改 fra