.net core工具組件系列之Autofac—— 第一篇:Autofac系列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群加入進行索要。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM