使用Autofac進行服務註冊實踐:web
新建三個項目,分別是webapi項目 Wesky.Core.Autofac以及兩個類庫項目 Wesky.Core.Interface和Wesky.Core.Service。json
在Webapi項目下,引用Autofac的三個包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。api
在類庫下,Interface用於編寫Interface接口類;Service用於開發對應的接口實現類。如今先準備了6個接口和實現,用來測試,方法實現都同樣,都是打印當前方法名稱。如圖:ide
在webapi項目下的Program類裏面,添加對autofac工廠(AutofacServiceProviderFactory)的服務實現。如圖,須要先 using Autofac.Extensions.DependencyInjection;模塊化
在Startup類下面,新建無返回值的方法ConfigureContainer,而且帶有一個ContainerBuilder類型的參數。而後在裏面添加兩個服務的註冊,例如ServiceA和ServiceD,用來測試使用:測試
新增一個控制器TestController,而且實現一個叫Test方法的webapi,用來實驗是否依賴注入服務生效:ui
運行程序,並調用webapi,驗證依賴注入的結果:spa
Autofac依賴注入的幾個相對常見的生命週期:blog
一、瞬時 InstancePerDependency:每次獲取的服務實例都不同;繼承
二、單例 SingleInstance:在整個容器中獲取的服務實例都是同一個;
三、做用域 InstancePerLifetimeScope:相同做用域下獲取到的服務實例相同;
四、做用域 InstancePerMatchingLifetimeScope(「做用域名稱」):能夠指定到某一個具體做用域;
五、每次請求 InstancePerRequest:不一樣的請求獲取的服務實例不同;
六、隱式關係類型的嵌套做用域 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羣加入進行索要。
感謝觀看,歡迎留言提供寶貴意見或推薦,謝謝!