使用Autofac進行服務註冊實踐:
新建三個專案,分別是webapi專案 Wesky.Core.Autofac以及兩個類庫專案 Wesky.Core.Interface和Wesky.Core.Service。
在Webapi專案下,引用Autofac的三個包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。
在類庫下,Interface用於編寫Interface介面類;Service用於開發對應的介面實現類。現在先準備了6個介面和實現,用來測試,方法實現都一樣,都是列印當前方法名稱。如圖:
在webapi專案下的Program類裡面,新增對autofac工廠(AutofacServiceProviderFactory)的服務實現。如圖,需要先 using Autofac.Extensions.DependencyInjection;
在Startup類下面,新建無返回值的方法ConfigureContainer,並且帶有一個ContainerBuilder型別的引數。然後在裡面新增兩個服務的註冊,例如ServiceA和ServiceD,用來測試使用:
新增一個控制器TestController,並且實現一個叫Test方法的webapi,用來實驗是否依賴注入服務生效:
執行程式,並呼叫webapi,驗證依賴注入的結果:
Autofac依賴注入的幾個相對常見的生命週期:
1、瞬時 InstancePerDependency:每次獲取的服務例項都不一樣;
2、單例 SingleInstance:在整個容器中獲取的服務例項都是同一個;
3、作用域 InstancePerLifetimeScope:相同作用域下獲取到的服務例項相同;
4、作用域 InstancePerMatchingLifetimeScope(“作用域名稱”):可以指定到某一個具體作用域;
5、每次請求 InstancePerRequest:不同的請求獲取的服務例項不一樣;
6、隱式關係型別的巢狀作用域 InstancePerOwned:可以使用每一個擁有例項的註冊來依賴關係限定到擁有的例項。
對應註冊的方式如下程式碼所示:
現在對這些例項的生命週期做個測試,編寫一些測試程式碼,用來驗證生命週期:
在方法最後加個斷點,然後執行程式。
A1和 A2是瞬時週期進行註冊,每次都會產生不同的例項,所以兩個例項不一樣;
B1 和 B2是單例進行註冊,會引用同一個例項,所以兩者的例項相等;
C1和C2、C3和C4分別在兩個作用域下進行作用域註冊,所以在同一個作用域下,C1和C2、C3和C4的例項分別相等;但是C1和C3不屬於同一個作用域,所以不相等。D1/2/3/4類似,不再描述。
詳情,如圖所示:
Autofac通過模組化進行註冊服務
新建一個繼承自Autofac.Module的類WeskyModule,並在裡面提供Load方法的實現(在方法裡面進行服務註冊),下面使用一些其他方式進行註冊,如程式碼以及註釋部分:
在Startup類的ConfigureContainer方法下,註釋之前的註冊服務,改為引用Module模組來進行服務註冊:
執行程式,在註冊ServiceE的時候會提示錯誤,這是因為上面註冊時候,排除了ServiceE所導致的,會提示服務沒註冊,如圖:
現在先遮蔽掉對E服務的依賴,檢視註冊效果,直接在註冊以後,訪問註冊服務的Hello方法,並執行檢視結果。說明服務註冊成功:
Autofac通過配置檔案進行服務註冊的方式
Autofac也可以通過配置檔案進行註冊服務,下面做個簡單的例子。
新建一個叫做autofac.json的檔案,然後在裡面寫上兩個簡單的單例註冊。注意:新建的json檔案需要設定為始終複製,防止生成以後沒有存在根目錄裡面導致的找不到檔案的問題。
然後在WeskyModule裡面,註釋掉先前的註冊,使用以下程式碼進行獲取配置檔案的註冊,並對A、B(B沒有在檔案裡面註冊,正常情況下應該是要報錯的) 和C進行測試。
執行程式,可以看到由於B並沒有在檔案裡面註冊,所以執行到服務B時候,提示未註冊服務異常:
由此可見,通過配置檔案進行服務註冊符合預期,測試完畢。
Autofac實現AOP切面功能
先新增Autofac.Extras.DynamicProxy的包:
新建一個叫做WeskyAOP的類,並且繼承自,然後實現裡面的Intercept方法,示例如下:
然後為了方便,我直接在下方新建一個IWeskyTest介面和WeskyTest類,並且提供一個Hello方法進行測試。以及對IWeskyTest新增了上面AOP的標記,如下:
返回WeskyModule裡面,把先前註冊的內容註釋掉,然後新增對新增AOP服務的註冊,以及新增服務介面的註冊,此處註冊為一個單例,不過會行不通,不信的可以自己嘗試:
在Test控制器裡面,新增對IWeskyTest介面服務的依賴注入,並在測試的api裡面呼叫Hello方法進行測試。列印出AOP裡面的兩句語句,代表AOP實現成功。注意,以上使用單例或者其他的進行註冊是不成功的,必須使用 EnableInterfaceInterceptors (需要using Autofac.Extras.DynamicProxy)
另外,把標記寫到實現類上也是OK的,例如:
熬夜寫部落格太累了,未完,待續……後續繼續更新Autofac的屬性注入、以及過濾器裡面實現依賴注入等方法,如有需要,歡迎提前關注。
如有需要有關資料或是本篇文章原始碼,可以點選下方Q群加入進行索要。
感謝觀看,歡迎留言提供寶貴意見或推薦,謝謝!