這篇文章主要講解了“如何在ASP.NET Core程序啟動(dòng)前運(yùn)行代碼”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何在ASP.NET Core程序啟動(dòng)前運(yùn)行代碼”吧!
在吳川等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),營(yíng)銷(xiāo)型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,吳川網(wǎng)站建設(shè)費(fèi)用合理。
因?yàn)檫@一篇文章更多的是在說(shuō)明我在解決這個(gè)問(wèn)題時(shí)的一步步思考,并沒(méi)有涉及到代碼的編寫(xiě),所以下面的內(nèi)容可能對(duì)你的幫助并不是很大,所以這里提前將實(shí)現(xiàn)的方式告訴大家。對(duì)于這個(gè)問(wèn)題來(lái)說(shuō),只需要將我們想要執(zhí)行的代碼放到下面代碼中注釋所在的位置,即可實(shí)現(xiàn)我們的需求。
|
|
在嘗試如何在 ASP.NET Core 中實(shí)現(xiàn)這一功能需求前,我們可以看看在 .NET Framework 中如何實(shí)現(xiàn)這一功能,是不是可以對(duì)我們?cè)诤罄m(xù)的功能實(shí)現(xiàn)中提供某些借鑒。
對(duì)于采用 .NET Framework 的應(yīng)用程序來(lái)說(shuō),項(xiàng)目創(chuàng)建后會(huì)生成一個(gè) Global.asax 文件,在這個(gè)類文件中存在著 Application_Start 這樣的一個(gè)方法,而 Application_Start 這個(gè)方法實(shí)際上是在當(dāng)應(yīng)用程序接收到第一個(gè) HTTP 請(qǐng)求時(shí)觸發(fā),也就是說(shuō),當(dāng)系統(tǒng)運(yùn)行后第一次接收到用戶的請(qǐng)求,就會(huì)觸發(fā) Application_Start 中的代碼邏輯,后續(xù)不管再接收到多少的請(qǐng)求,都不會(huì)再觸發(fā)該方法。
例如在這個(gè)基于 .NET Framework 構(gòu)建的 MVC 項(xiàng)目模板中,在程序運(yùn)行前需要執(zhí)行注冊(cè)路由信息、注冊(cè)過(guò)濾器、注冊(cè)使用 bundle 壓縮后的 js、css 文件等等。
但是在 ASP.NET Core 項(xiàng)目中,并沒(méi)有原生存在這樣的方法,那么我們?nèi)绾卧?ASP.NET Core 應(yīng)用中自己動(dòng)手實(shí)現(xiàn)類似的功能呢?
了解了在之前版本中的實(shí)現(xiàn)方式,現(xiàn)在我們仔細(xì)看看 Application_Start 這個(gè)方法中執(zhí)行的每行代碼的功能,是不是特別像我們?cè)?ASP.NET Core 項(xiàng)目中使用的各種中間件?
然而,如果你有使用過(guò) ASP.NET Core 后就會(huì)知道,ASP.NET Core 中的中間件是會(huì)在每次請(qǐng)求時(shí)都會(huì)觸發(fā)的,雖然我們可以在我們自定義的中間件中設(shè)置緩存中不存在數(shù)據(jù)就寫(xiě)入,存在就直接跳過(guò)的代碼邏輯,但是既然除了第一次訪問(wèn)時(shí)才會(huì)真正執(zhí)行該中間件的功能,后面完全用不到,因此,對(duì)于我這種略微強(qiáng)迫癥的童鞋來(lái)說(shuō),這個(gè)真的不能忍。。。
既然中間件不可以,而我們需要的僅僅是只運(yùn)行一次,提到 .NET Core,不知道你的第一印象是什么,對(duì)于我個(gè)人來(lái)說(shuō),無(wú)處不在的依賴注入,可能是我在 18 年開(kāi)始學(xué)習(xí) .NET Core 時(shí)的第一印象。我們知道,對(duì)于 .NET Core 中原生的依賴注入組件,存在著三種生命周期:Singleton、Scoped 以及 Transient,對(duì)于這三種生命周期的具體解釋,還是推薦博客園里蔣金楠老師的一篇文章(電梯直達(dá))。
對(duì)于采用 Singleton 方式注入的服務(wù)來(lái)說(shuō),因?yàn)槭且环N類似于全局單例的形式,不管后續(xù)從何處進(jìn)行訪問(wèn),都會(huì)訪問(wèn)的是同一個(gè)實(shí)例,那么,這里是不是就可以在此基礎(chǔ)上實(shí)現(xiàn)我們的需求了呢?
很不幸,這里其實(shí)是有個(gè)很?chē)?yán)重的邏輯上的問(wèn)題的,依賴注入最終的目的是為了實(shí)現(xiàn)將我們定義的服務(wù)契約與實(shí)現(xiàn)進(jìn)行解耦,實(shí)現(xiàn)服務(wù)的消費(fèi)者只需要告訴依賴注入容器自己所需要服務(wù)的類型(服務(wù)接口 or 抽象服務(wù)類),就能自動(dòng)得到與之匹配的服務(wù)實(shí)例。
簡(jiǎn)單點(diǎn)說(shuō)就是,消費(fèi)方要告訴服務(wù)提供方你要開(kāi)始使用某個(gè)服務(wù)了,我才能給你提供對(duì)應(yīng)的服務(wù),就像我們?nèi)ワ埖瓿燥垼邳c(diǎn)了菜后,沒(méi)有必要關(guān)心廚師是用天然氣 or 煤氣給你燒的菜,但是能不能上菜的關(guān)鍵在于我們有沒(méi)有點(diǎn)菜。因此,這個(gè)問(wèn)題最終還是落在了我們應(yīng)該在程序中的什么地方去調(diào)用我們?cè)O(shè)定好的方法。
繞了一圈,似乎我們的想法越來(lái)越偏,離我們想要實(shí)現(xiàn)的越來(lái)越遠(yuǎn),既然路偏了,那就直接回到起點(diǎn)吧,拋棄我們?cè)?.NET Framework 項(xiàng)目中的經(jīng)驗(yàn),重新從 ASP.NET Core 項(xiàng)目的啟動(dòng)流程開(kāi)始看起。
在 ASP.NET Core 應(yīng)用的啟動(dòng)過(guò)程中存在著兩個(gè)非常重要的對(duì)象,對(duì)應(yīng)到我們采用的 ASP.NET Core 3.X 的項(xiàng)目中則是 Host 以及 HostBuilder。這里的 Host 就是承載我們 Web 應(yīng)用運(yùn)行的載體,而 HostBuilder 則是用來(lái)構(gòu)建 Host 對(duì)象的。
PS:因?yàn)?ASP.NET Core 3.0 開(kāi)始加入了 對(duì)于 gRPC 框架和 Windows Service 的支持,同時(shí)為了與其它非 Web 服務(wù)器方案進(jìn)行集成,因此將原來(lái)的 WebHost 和 WebHostBuilder 替換成了新的通用主機(jī)(generic-host)配置的模式 。當(dāng)然,在 3.X 版本你還是可以使用 WebHost 和 WebHostBuilder 的,不過(guò)當(dāng)然是不推薦的。
因?yàn)閷?duì)于 ASP.NET Core 應(yīng)用程序來(lái)說(shuō),本質(zhì)上其實(shí)只是一個(gè)控制臺(tái)應(yīng)用,所以現(xiàn)在我們來(lái)看看對(duì)于一個(gè)控制臺(tái)應(yīng)用中最重要的文件:Program.cs, Program 類中的代碼如下所示。
|
|
代碼很少,功能也很簡(jiǎn)單,簡(jiǎn)單來(lái)說(shuō),在 Main 方法中構(gòu)建 HostBuilder 對(duì)象,然后去運(yùn)行它,達(dá)到啟動(dòng)我們 Web 應(yīng)用宿主的目的。
當(dāng)然,在構(gòu)建 HostBuilder 對(duì)象的過(guò)程中,會(huì)配置 Kestrel 服務(wù)器,會(huì)設(shè)置 ContentRoot,會(huì)加載配置文件等等一系列的動(dòng)作,因?yàn)樽约核教危瑖L試了一下,還是解釋不好,如果你想要深入了解的話,建議配合博客園里面的這兩篇文章一起食用(200行代碼,7個(gè)對(duì)象——讓你了解 ASP.NET Core 框架的本質(zhì)、ASP.NET Core 2.0 : 七.一張圖看透啟動(dòng)背后的秘密)。雖然參考文章中都是基于 ASP.NET Core 2.X 版本進(jìn)行解釋說(shuō)明的,但其實(shí)最終的差異不是很大。
不知你是否找到了這個(gè)類中對(duì)于我們最重要的一點(diǎn),在 Main 方法中,我們是先構(gòu)建、再去運(yùn)行,因此,我們是不是可以在構(gòu)建完成后,先等一等,把我們想要實(shí)現(xiàn)的功能先調(diào)用了,再去運(yùn)行我們的程序。嗯,讓我們改造下 Main 方法中的代碼。
|
|
感謝各位的閱讀,以上就是“如何在ASP.NET Core程序啟動(dòng)前運(yùn)行代碼”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何在ASP.NET Core程序啟動(dòng)前運(yùn)行代碼這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
文章題目:如何在ASP.NETCore程序啟動(dòng)前運(yùn)行代碼
文章來(lái)源:http://www.chinadenli.net/article26/gpeicg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、微信公眾號(hào)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、電子商務(wù)、用戶體驗(yàn)、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)