.net core番外第一篇:Autofac的幾種常見注入方式、生命周期和AOP

 

使用Autofac進行服務註冊實踐:

 

新建三個項目,分別是webapi項目 Wesky.Core.Autofac以及兩個類庫項目 Wesky.Core.InterfaceWesky.Core.Service

Webapi項目下,引用Autofac的三個包:AutofacAutofac.ConfigurationAutofac.Extensions.DependencyInjection 

 

 

在類庫下,Interface用於編寫Interface接口類;Service用於開發對應的接口實現類。現在先準備了6個接口和實現,用來測試,方法實現都一樣,都是打印當前方法名稱。如圖:

 

 

webapi項目下的Program類裏面,添加對autofac工廠(AutofacServiceProviderFactory)的服務實現。如圖,需要先 using Autofac.Extensions.DependencyInjection;

 

 

Startup類下面,新建無返回值的方法ConfigureContainer,並且帶有一個ContainerBuilder類型的參數。然後在裏面添加兩個服務的註冊,例如ServiceAServiceD,用來測試使用:

 

 

新增一個控制器TestController,並且實現一個叫Test方法的webapi,用來實驗是否依賴注入服務生效:

 

 

運行程序,並調用webapi,驗證依賴注入的結果:

 

 

Autofac依賴注入的幾個相對常見的生命周期

1、瞬時 InstancePerDependency:每次獲取的服務實例都不一樣;

2、單例 SingleInstance:在整個容器中獲取的服務實例都是同一個;

3、作用域 InstancePerLifetimeScope:相同作用域下獲取到的服務實例相同;

4、作用域 InstancePerMatchingLifetimeScope(「作用域名稱」):可以指定到某一個具體作用域;

5、每次請求 InstancePerRequest:不同的請求獲取的服務實例不一樣;

6、隱式關係類型的嵌套作用域 InstancePerOwned:可以使用每一個擁有實例的註冊來依賴關係限定到擁有的實例。

對應註冊的方式如下代碼所示:

 

 

現在對這些實例的生命周期做個測試,編寫一些測試代碼,用來驗證生命周期:

 

 

 

在方法最後加個斷點,然後運行程序。

A1和 A2是瞬時周期進行註冊,每次都會產生不同的實例,所以兩個實例不一樣;

B1 和 B2是單例進行註冊,會引用同一個實例,所以兩者的實例相等;

C1C2C3C4分別在兩個作用域下進行作用域註冊,所以在同一個作用域下,C1C2C3C4的實例分別相等;但是C1C3不屬於同一個作用域,所以不相等。D1/2/3/4類似,不再描述。

詳情,如圖所示:

 

 

Autofac通過模塊化進行註冊服務

新建一個繼承自Autofac.Module的類WeskyModule,並在裏面提供Load方法的實現(在方法裏面進行服務註冊),下面使用一些其他方式進行註冊,如代碼以及注釋部分:

 

 

Startup類的ConfigureContainer方法下,注釋之前的註冊服務,改為引用Module模塊來進行服務註冊:

 

 

運行程序,在註冊ServiceE的時候會提示錯誤,這是因為上面註冊時候,排除了ServiceE所導致的,會提示服務沒註冊,如圖:

 

 

 

現在先屏蔽掉對E服務的依賴,查看註冊效果,直接在註冊以後,訪問註冊服務的Hello方法,並運行查看結果。說明服務註冊成功:

 

 

Autofac通過配置文件進行服務註冊的方式

Autofac也可以通過配置文件進行註冊服務,下面做個簡單的例子。

新建一個叫做autofac.json的文件,然後在裏面寫上兩個簡單的單例註冊。注意:新建的json文件需要設置為始終複製,防止生成以後沒有存在根目錄裏面導致的找不到文件的問題。

 

 

然後在WeskyModule裏面,注釋掉先前的註冊,使用以下代碼進行獲取配置文件的註冊,並對AB(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群加入進行索要。

感謝觀看,歡迎留言提供寶貴意見或推薦,謝謝!