跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展
前言
????前兩節針對.NetCore自帶的依賴注入進行簡要概述,對于日常開發的需求應該是能滿足了,那為什么還需要引入第三方依賴注入組件呢,這里就從自帶的依賴注入來分析,有什么樣的需求滿足不了?主要歸納為以下幾點:
屬性注入:自帶的依賴注入不支持屬性注入方式,而現階段開發,屬性開發模式應該在程序中無處不在了;
按名稱注入:自帶的依賴注入不支持名稱注入,當注入多個同接口的不同實現時,要獲取指定類型的對象不太方便,但通過名稱可以方便獲取;
注冊方式:自帶的依賴注入需要指定具體類型,這樣每增加一個新類型就要添加注冊,程序員“精益求精”的思維會問:有沒有只要添加新類型就能自動注冊的方式?有,第三方依賴注入組件提供了程序集注入的形式;
其他擴展功能:除了上面提到,第三方依賴注入組件還有很多擴展功能,比如更多的注冊方式、子容器管理、基于動態代理的AOP等,這里的AOP很有用,就是通常說的面向切面編程,接下來會對此做一個簡單的案例;
????說了這么多,不就是為了說明根據實際需要,可以引入第三方依賴注入組件進行增強容器的能力,不廢話,直接看看怎么用;
正文
????不行,這里還得嘮叨一下,畢竟現在開發社區中依賴注入的框架很多,目前都有哪些?又怎么選呢?
????比較流行依賴注入組件有哪些呢?
Autofac
Castle Windsor
Unity
Spring.Net
StructureMap
Ninject
? ?
????這里就不進行性能對比了,有好多大牛進行了性能測試對比,搜索引擎都有,上面看到標注紅色的前幾個,其實也就是相對來說比較流行,而Spring.Net最近幾年用的不火了,不過剛開始的時候的確風靡過一段時間;從開發社區來看,當下Autofac、Castle Windsor是最火,其中Autofac似乎更讓開發者喜愛;而對于StructureMap,有大牛做過性能測試,它的性能和Autofac相對其他來說更有優勢;
????其實我想說,主要是看項目需求啦,如果沒有太苛刻的要求的話,可以根據項目技術情況進行選擇,但是我還是優先推薦Autofac、Castle Windsor、Unity,強烈推薦Autofac,畢竟大家都在用,好多比較火的框架都集成了,比如:ABP_vNext,不過多會用幾個絕對沒壞處;
????來,開干,將Autofac集成在Asp.NetCore中,三小步搞定:
??通過Nuget安裝Autofac包;
修改 Program.cs 將默認ServiceProviderFactory指定為AutofacServiceProviderFactory;
??在 Startup.cs 中添加 ConfigureContainer 方法 ;
這里加一個模擬業務邏輯層和數據層,后續方便演示
數據層:
業務邏輯層,這一層引用數據層:
ConfigureContainer?方法添加注冊
????通過以上三步就集成了AutoFac,成不成功拉出來遛遛,在Action中使用:
? ? 運行調試,走你:
? ? 可見默認屬性注入沒有開啟,注冊時優化一下:
????再運行調試,走你:
????這次運行的時候,服務層屬性注入成功,但Controller那還不行,因為我們沒有將Contoller的屬性注入功能開啟,接下下來在程序集注冊的時候說說;
????通過上面的服務注冊,每添加一個類型都要在注冊的地方添加,可以通過程序集的注冊方式,后續就不用每次添加了,如下:
代碼簡單說明及注意:
代碼中的AsImplementedInterfaces是暴露所有接口;
Assembly.Load加載程序集,有多種加載方式如Assembly.LoadFrom/LoadFile等,需要注意每個方法的使用前提,不然找不到程序集文件;
注冊時其中的Where是用來過濾類型,找到符合條件的類型;
????運行調試,都注入上了,以后在對應程序集中添加類型就不用每次在注冊的地方添加該類型的注冊代碼了
????剛才遺留的控制器屬性注入問題,為什么放在這里說呢,因為要用到程序注冊方式,兩步走:
?????這樣就可以在Controller中進行屬性注入了;運行,之前不能注入的都成功了;當然還有其他的方式,這里沒有深入;
??? Autofac的注冊方式有點多,這里就不一一舉例了,可以到官網進行詳情了解;?之前說到AOP功能,這里舉例說明一下,畢竟這在實際開發項目中比較重要,這里不說原理,之前寫過一篇博客,可以去看一下:
Asp.NetCore?中Aop的應用
https://www.cnblogs.com/zoe-zyq/p/12803450.html
????通常,在項目中,業務層做邏輯處理、數據處理比較多,通常我們會在業務層進行相關緩存處理及其他處理,所以這里在業務層中舉例演示(當然其他層也可以):
????既然要進行切面處理,得有個地方處理,所以得增加個攔截器,Nuget先安裝一個包:Autofac.Extras.DynamicProxy;
? ? 注冊的時候開啟切面功能,并指定對應攔截器進行處理;
? ?? ?這樣就能通過攔截器擴展相關功能,業務邏輯前后都行,也可以不調用原有的業務代碼,通過攔截器短路,運行結果如下:
????可以看到,請求完之后,在對應的業務處理前后都進行了對應處理,這里之所以有兩次,那是因為上面測試代碼調用了兩次;
????像這種無嵌入型進行擴展的AOP編程方式,是非常有用的,擴展和維護功能也比較方便,有人說性能問題有降低,當然會有那么一點,相對來說,是可以接受的,除非是擴展業務邏輯耗時多,這就需要另想方案了;
總結
??? Autofac這里就簡要說這么多,詳情到官方研究吧,還有很多東西,但思路基本上就是這樣;接下來開始說說配置,因為配置比較重要,從之前啟動流程中就體現出來;
總結
以上是生活随笔為你收集整理的跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟我一起学.NetCore之配置初体验
- 下一篇: .NET Core 下使用 Kafka