一文學會Autofac的基礎操作:幾種實現注冊方式、3種注入方式、生命周期、AOP以及過濾器實現依賴注入...

前言:直接開干。

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

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

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

?304cd7fb821ddbf3a9659ef22bc08c8a.png

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

?683c2a45cb900ae063019ae49ba4d07d.png

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

?ca3f022e6d0c87fdcac92f5dcd3d8e1d.png

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

ef67e53515615d491a95ac658b88adb0.png?

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

?0c51646cc19f3873f5c47676c296faff.png

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

?2934b88078448f57606fa2d79b7b9d32.png

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

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

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

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

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

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

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

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

?2f8789d8639ed036c52a8eb5b0a672b4.png

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

?24869757229a5fdc87f6090c88a9c966.png

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

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

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

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

詳情,如圖所示:

?011e6f1db7a157f094b44210c5b0d5ce.png

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

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

?edd6f1b9e92706d3cf2fc80a41bdbaf5.png

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

?5968f492e4485e53c11e938fea3c53e5.png

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

?be2a326bd5702f9d10ca7733a57187f6.png

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

?d976305e0e6590ae7967a2b43869f204.png

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

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

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

?797712bf93630d5cb804133dd394e8d0.png

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

?ddbea28bcd1c2e0350ab4162260c2025.png

運行程序,可以看到由于B并沒有在文件里面注冊,所以運行到服務B時候,提示未注冊服務異常:

?f98ed37939d09f40a641dbf138cac9ec.png

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

Autofac實現AOP切面功能

先添加Autofac.Extras.DynamicProxy的包:

?1df0b1e1eebbeb0ed454a7bc233679f4.png

新建一個叫做WeskyAOP的類,并且繼承自,然后實現里面的Intercept方法,示例如下:

?190f8548fc2d2689679ac5636b6591bb.png

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

?48a945e4c29f76e76da4105749c2db81.png

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

?fe02630aaf07920a68e4efa1ba2d33ec.png

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

?c98389efe1651ca98a0722b37bc1ef93.png

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

?8294a3ab03d5795e14f3163de8267c59.png

Autofac通過構造函數注入

如前面內容所示,獲取實例都是通過構造函數進行。此處通過構造函數獲取實例,還有一種通過構造函數傳入IServiceProvider進行獲取。該方法可以極大減少構造函數傳入的實例過多所導致的構造函數參數臃腫。示例直接使用前篇項目做拓展,在控制器的測試api下面,直接使用。有關示例如下圖所示:

?c54a56e9a52368b6f4c4706f5afcbd4c.png

設置斷點,并運行程序查看效果。可見IWeskyTest接口已經被注入進來,并且可以訪問到

?c4d231066c579ee6850ef11941d02747.png

Autofac通過屬性注入方式

在ServiceA實現類里面,添加IServiceB、IServiceC的屬性。并且在ServiceA實現類里面,添加一個測試方法?Hey(),在里面對以上兩個屬性所對應的接口方法進行調用。代碼如下:

?12683c5762fc45443cb26c3e7540f0f8.png

以及Hey需要加入到抽象類接口IServiceA:

?0ea0f49fe22b4b76a63561b48e58209d.png

對IServiceA\B\C進行服務注冊。其中,提供屬性的服務,注冊時候必須使用PropertiesAutowired方式,如下面代碼所示:

?6044cd1f04ade5f4972c3ab401d116cb.png

接著改寫控制器里面的Test方法進行測試。對應代碼以及解釋和對應的運行結果如下圖所示:

?0b5fecfcc4b6a0c5dc5d78a5902e23e7.png

Autofac通過方法注入方式

改寫上面ServiceA的類為如下代碼。有關代碼說明如圖:

?b461c40aed857231985fbed8bd0863c7.png

對用到的IServiceA和B進行服務注冊。如圖所示,ServiceA里面提供了方法注入,所以需要在注冊A服務的時候,使用OnActivated方法。其中,RegisterService是ServiceA服務里面提供的需要當做方法注入的方法,方法里面的IServiceB是需要被方法注入的抽象類(接口)。以下使用了瞬時,也可以使用其他的,沒有限制,包括ServiceB服務注冊時候,也可以使用非單例模式,不做限制。

?3b1af12668d57ed2646491c3c8d84771.png

運行程序,如果先后打印ServiceA?和?ServiceB,則代表方法注入成功。運行程序結果如下:

?71defa6daf3c51b0ce7c76df96b1a849.png

Filter過濾器里面實現支持依賴注入

先編寫一個過濾器WeskyFilter,繼承自?ActionFilterAttribute。并且在里面添加一個屬性注入的IServiceC和一個構造函數注入的IServiceD。

然后在OnActionExecuting和OnActionExecuted方法下面實現一個打印的內容,并且分別打印ServiceC實例和ServiceD實例下面的Hello方法。代碼如下:

?9a7c5d183fcecb8619baaa28649ab8bf.png

對IServiceC、D進行服務注冊,以及注冊WeskyFilter過濾器,用以支持依賴注入:

?42b424c30919598927b90b30815e90b3.png

在控制器里面的Test方法上面,添加過濾器標記,并直接運行進行結果驗證:

?4f44d9f8c42e460fa52bfdb37cff88c3.png

如圖所示,打印出過濾器里面的內容,并且成功訪問到了ServiceC和D的Hello方法,代表在過濾器里面實現依賴注入也是可以的。

如果覺得有幫助,歡迎轉發、在看和留言。

如果對.NET技術感興趣,或者愿意分享自己的知識,也歡迎掃碼加入我的群聊,7天內有效:

d2aa65ba3a0c022b4a67aa512a40d37f.png

最后再次感謝大家觀看~謝謝大家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283852.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283852.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解析互聯網廣告術語 CPM、CPC、CPA、CPS、CPL、CPR 是什么意思

1. CPM(Cost per mille),每千次展現收費 這是一種最為常見的廣告模式,也是很多網站流量變現的一種途徑,這種廣告不管計算點擊,或者什么注冊下載之類的轉化,只要這個廣告在網站上被正常的展現給…

JavaScript數組迭代方法(圖解)

轉載于:https://www.cnblogs.com/seanna/p/6724032.html

Rider調試ASP.NET Core時報thread not gc-safe的解決方法

新建了一個ASP.NET Core 5.0的Web API項目,當使用斷點調試Host.CreateDefaultBuilder(args)時,進入該函數后查看中間變量的值,報錯Evaluation is not allowed: The thread is not at a GC-safe point。在群里問了也沒人回應,可能沒…

The SDK platform-tools version ((23)) is too old to check APIs compiled with API 26;

好像是更新過啥SDK之后,項目一直在包名的那一行顯示紅線,不過是不報編譯錯誤的,就是看著老扎心老扎心的,開始以為是指定的SDK版本的問題,修改后發現無效,最后找到方法解決: 打開SDK Manager ---…

oracle 各種日期函數格式和操作

2019獨角獸企業重金招聘Python工程師標準>>> ORACLE日期時間函數大全 TO_DATE格式(以時間:2007-11-02 13:45:25為例) Year: yy two digits 兩位年 顯示值:07 yyy three digits 三位年 顯示值:00…

火山引擎李玉光:字節跳動大規模K8s集群管理實踐

2022年5月31日,在CSDN云原生系列在線峰會第6期“K8s大規模應用和深度實踐峰會”,火山引擎資深云原生架構師李玉光分享了《字節跳動大規模K8s集群管理實踐》。 字節跳動云原生體系 字節跳動內部云原生技術的使用貫穿組織技術體系各層面,整體如…

(7)關于margin的一些想法2.0

這篇主要討論的就是margin負值與float的關系。 首先&#xff0c;例子。 <!doctype html> <html> <head> <meta charset"utf-8"> <title>無標題文檔</title> <style typetext/css> html,body{padding:0;margin:0;} div{wid…

解決ASP.NET Core在Task中使用IServiceProvider的問題

前言問題的起因是在幫同事解決遇到的一個問題&#xff0c;他的本意是在EF Core中為了解決避免多個線程使用同一個DbContext實例的問題。但是由于對Microsoft.Extensions.DependencyInjection體系的深度不是很了解&#xff0c;結果遇到了新的問題&#xff0c;當時整得我也有點蒙…

什么是SRE?一文詳解SRE運維體系

在任何有一定規模的企業內部&#xff0c;一旦推行起來整個SRE的運維模式&#xff0c;那么對于可觀測性系統的建設將變得尤為重要&#xff0c;而在整個可觀測性系統中。 可觀測性系統 在任何有一定規模的企業內部&#xff0c;一旦推行起來整個SRE的運維模式&#xff0c;那么對于…

python初探

python近兩年似乎已經很熱了&#xff0c;不了解一下怎么能行呢&#xff0c;似乎python最大的優點就是簡潔、易懂、優雅。目前豆瓣、知乎等后臺服務使用的也都是python語言。 python一般可以用于網站服務、小工具、數據分析等工作。它作為高級語言&#xff0c;和js一樣&#xff…

Linux系統PATH變量配置

alias命令用于設置命令的別名&#xff0c;格式為“alias 別名命令” 例如擔心復制文件時誤將文件被覆蓋&#xff0c;可以執行alias cp" cp -i"&#xff0c;如此一來 每次復制命令都會詢問用戶是否要覆蓋。 unalias命令用于取消命令的別名&#xff1a;格式為"una…

solr5.5索引mysql數據(新手總結)

一 solr5.5環境部署到Eclipse(luna版&#xff09; solr部署參見&#xff1a;http://blog.csdn.net/csmnjk/article/details/64121765 二 Ik分詞器設置 IK分詞器設置參見:http://blog.csdn.net/csmnjk/article/details/51693578 solr4版本的schema.xml文件對應solr5版本的manage…

老板加薪!看我做的WPF Loading!!!

老板加薪&#xff01;看我做的WPF Loading&#xff01;&#xff01;&#xff01;控件名&#xff1a;RingLoading作者&#xff1a;WPFDevelopersOrg原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal框架使用大于等于.NET40&#xff1b;Visua…

如何避免下重復訂單

電子交易的一個很基本的問題&#xff0c;就是避免用戶下重復訂單。用戶明明想買一次&#xff0c;結果一看下了兩個單。如果沒有及時發現&#xff0c;就會帶來額外的物流成本和扯皮。對商家的信譽也不好看。 從技術上看&#xff0c;這是一個分布式一致性問題&#xff1b;但實際…

圖像分類學習筆記

1.計算機認識圖像的方式&#xff1a;都是數字。例如一個 128X128 的3通道的圖片 是由 128X128X3個數字 組成的。 2.面臨的難點&#xff1a;一幅圖可以說明。 3.分類器 A&#xff1a;Nearest Neighbor Classifier&#xff1a;與CNN無關&#xff0c;但是可以幫助我們理解一下分類…

知物由學 | 干貨!一文了解安卓APP逆向分析與保護機制

“知物由學”是網易云易盾打造的一個品牌欄目&#xff0c;詞語出自漢王充《論衡實知》。人&#xff0c;能力有高下之分&#xff0c;學習才知道事物的道理&#xff0c;而后才有智慧&#xff0c;不去求問就不會知道。“知物由學”希望通過一篇篇技術干貨、趨勢解讀、人物思考和沉…

[轉]以終為始,詳細分析高考志愿該怎么填

為什么寫這篇文章&#xff1f; 之所以寫本文&#xff0c;是因為我自己有用處。 我簡要介紹&#xff0c;長話短說。我從一個普通的211本科畢業&#xff0c;已經接受社會"毒打"多年&#xff0c;回想起高考填志愿&#xff0c;依然會覺得有些許遺憾。我在貴州省的一個小縣…

ASP.NET Core 中的重定向

前言在《如何使用ASP.NET Core Web API實現短鏈接服務》中&#xff0c;我們使用了Redirect方法返回跳轉狀態碼:[HttpGet("{shortUrl}")] public IActionResult GetUrl(string shortUrl) {var hashids new Hashids("公眾號My IO", minHashLength: 6);var i…

C#IO

System.IO 命名空間包含允許讀寫文件和數據流的類型以及提供基本文件和目錄支持的類型。string url "C:\chisp.log";if (System.IO.File.Exists(url)){Response.Write("文件存在");}else{ Response.Write("文件不存在"); }System.IO.File.Exist…

Lind.DDD.Manager里的3,7,15,31,63,127,255,511,1023,2047

回到目錄 進制 我是一個程序猿&#xff0c;我喜歡簡單的數字&#xff0c;十進制如何&#xff0c;數字太多&#xff0c;有10種數字組成&#xff0c;但由于它廣為人知&#xff0c;所有使用最為廣泛&#xff0c;人們的慣性思維培養了十進制&#xff0c;并說它是最容易被計算的數字…