天天看點

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

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

建立三個項目,分别是webapi項目 Wesky.Core.Autofac以及兩個類庫項目 Wesky.Core.Interface和Wesky.Core.Service。

在Webapi項目下,引用Autofac的三個包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

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

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

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

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

在Startup類下面,建立無傳回值的方法ConfigureContainer,并且帶有一個ContainerBuilder類型的參數。然後在裡面添加兩個服務的注冊,例如ServiceA和ServiceD,用來測試使用:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

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

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

運作程式,并調用webapi,驗證依賴注入的結果:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

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

1、瞬時 InstancePerDependency:每次擷取的服務執行個體都不一樣;

2、單例 SingleInstance:在整個容器中擷取的服務執行個體都是同一個;

3、作用域 InstancePerLifetimeScope:相同作用域下擷取到的服務執行個體相同;

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

5、每次請求 InstancePerRequest:不同的請求擷取的服務執行個體不一樣;

6、隐式關系類型的嵌套作用域 InstancePerOwned:可以使用每一個擁有執行個體的注冊來依賴關系限定到擁有的執行個體。

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

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

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

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

在方法最後加個斷點,然後運作程式。

A1和 A2是瞬時周期進行注冊,每次都會産生不同的執行個體,是以兩個執行個體不一樣;

B1 和 B2是單例進行注冊,會引用同一個執行個體,是以兩者的執行個體相等;

C1和C2、C3和C4分别在兩個作用域下進行作用域注冊,是以在同一個作用域下,C1和C2、C3和C4的執行個體分别相等;但是C1和C3不屬于同一個作用域,是以不相等。D1/2/3/4類似,不再描述。

詳情,如圖所示:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

Autofac通過子產品化進行注冊服務

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

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

在Startup類的ConfigureContainer方法下,注釋之前的注冊服務,改為引用Module子產品來進行服務注冊:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

運作程式,在注冊ServiceE的時候會提示錯誤,這是因為上面注冊時候,排除了ServiceE所導緻的,會提示服務沒注冊,如圖:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

現在先屏蔽掉對E服務的依賴,檢視注冊效果,直接在注冊以後,通路注冊服務的Hello方法,并運作檢視結果。說明服務注冊成功:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

Autofac通過配置檔案進行服務注冊的方式

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

建立一個叫做autofac.json的檔案,然後在裡面寫上兩個簡單的單例注冊。注意:建立的json檔案需要設定為始終複制,防止生成以後沒有存在根目錄裡面導緻的找不到檔案的問題。

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

然後在WeskyModule裡面,注釋掉先前的注冊,使用以下代碼進行擷取配置檔案的注冊,并對A、B(B沒有在檔案裡面注冊,正常情況下應該是要報錯的) 和C進行測試。

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

運作程式,可以看到由于B并沒有在檔案裡面注冊,是以運作到服務B時候,提示未注冊服務異常:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

由此可見,通過配置檔案進行服務注冊符合預期,測試完畢。

Autofac實作AOP切面功能

先添加Autofac.Extras.DynamicProxy的包:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

建立一個叫做WeskyAOP的類,并且繼承自,然後實作裡面的Intercept方法,示例如下:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

然後為了友善,我直接在下方建立一個IWeskyTest接口和WeskyTest類,并且提供一個Hello方法進行測試。以及對IWeskyTest添加了上面AOP的标記,如下:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

傳回WeskyModule裡面,把先前注冊的内容注釋掉,然後添加對新增AOP服務的注冊,以及新增服務接口的注冊,此處注冊為一個單例,不過會行不通,不信的可以自己嘗試:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

在Test控制器裡面,添加對IWeskyTest接口服務的依賴注入,并在測試的api裡面調用Hello方法進行測試。列印出AOP裡面的兩句語句,代表AOP實作成功。注意,以上使用單例或者其他的進行注冊是不成功的,必須使用 EnableInterfaceInterceptors (需要using Autofac.Extras.DynamicProxy)

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

另外,把标記寫到實作類上也是OK的,例如:

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP

熬夜寫部落格太累了,未完,待續……後續繼續更新Autofac的屬性注入、以及過濾器裡面實作依賴注入等方法,如有需要,歡迎提前關注。

如有需要有關資料或是本篇文章源碼,可以點選下方Q群加入進行索要。

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

歡迎加入QQ群:

群号:1079830632

.net core工具元件系列之Autofac—— 第一篇:Autofac系列Autofac的幾種常見注冊方式、生命周期和AOP