ASP.Net Core MVC基礎(chǔ)系列之服務(wù)注冊(cè)和管道
想必大家都知道ASP.Net Core MVC默認(rèn)自帶了DI容器的, 我們可以很方便的進(jìn)行使用, 來方便管理對(duì)象和生命周期, 那么這一節(jié)我就會(huì)詳細(xì)講解服務(wù)注冊(cè), 順便簡(jiǎn)單講解一下管道, 讓大家知道了基本的MVC運(yùn)行流程.
回顧一下上一節(jié)的內(nèi)容, 我們從配置文件中獲取了輸出的字符, 也介紹各個(gè)配置的 "優(yōu)先級(jí)" (其實(shí)是配置覆蓋), 那么我們這一節(jié)以服務(wù)的方式輸出這個(gè)字符串, 然后用過DI進(jìn)行注冊(cè)服務(wù), 快速了解服務(wù)注冊(cè).
DI容器呢, 依賴接口, 所以我們先新建一個(gè)接口, 就叫 IWelcome , 接口里面定義個(gè)方法, 叫GetWelcomMsg, 然后再建個(gè)類, 實(shí)現(xiàn)這個(gè)接口, 這樣, 我們的一個(gè)最基本的服務(wù)就做好了. 代碼結(jié)構(gòu)和代碼如下圖 (我建了個(gè)文件夾, 存放這些服務(wù)):
代碼編寫完之后, 我們嘗試在Configure方法里面注入引用這個(gè)接口, 因?yàn)槲覀儷@取配置信息的時(shí)候也是直接在這個(gè)方法里面注入使用的, 那我們來試試, 代碼如下圖 :
一切都很正常, 方法也能調(diào)用, 我們跑起來試試看, 能不能正常使用.
一點(diǎn)都不意外, 它報(bào)錯(cuò)了, 報(bào)錯(cuò)信息如下圖 :
意思就是無法解析IWelcome這個(gè)服務(wù), 也是就無法注入這個(gè)服務(wù).
那么為什么IConfiguration,IHostingEnvironment,IApplicationBuilder等等之類的接口, 我們能直接注入使用呢, 那是ASP.Net Core MVC里面的源包里面, 已經(jīng)自動(dòng)為我們注冊(cè)好了這幾個(gè)服務(wù), 我們直接可以使用. 我們要使用自定義的服務(wù)或者組件, 需要我們自己進(jìn)行注冊(cè).
說到自定義服務(wù)注冊(cè), 就不得不說服務(wù)注冊(cè)的幾種方式, 或者說是幾種不同的注冊(cè)方法. 總共分為三種, 也就是三個(gè)注冊(cè)服務(wù)的方法.
我們看看 Startup 這個(gè)類, 會(huì)發(fā)現(xiàn)它里面有個(gè)ConfigureServices方法, 看名字就知道, 它是配置服務(wù)用的, 有個(gè)IServiceCollection接口參數(shù), 這個(gè)接口就是.Net Core默認(rèn)提供的DI服務(wù)的接口管理對(duì)象, 我們所有注冊(cè)的服務(wù)都可以通過這個(gè)接口進(jìn)行管理或操作. 如果使用第三方包, 如Autofac另說, 這里不介紹Autofac的使用.
那么我們就可以通過IServiceCollection接口進(jìn)行我們自定義服務(wù)的注冊(cè)了, 上面提到了有三個(gè)注冊(cè)服務(wù)的方法, 分別是 :
- 1.AddSingleton (單例模式注冊(cè)服務(wù), 也就是在整個(gè)應(yīng)用程序中, 只會(huì)創(chuàng)建一個(gè)接口對(duì)象, 所有的請(qǐng)求都會(huì)使用這個(gè)接口對(duì)象, 可能會(huì)有并發(fā)問題)
- 2.AddTransient (管道機(jī)制注冊(cè)服務(wù). 也是在每個(gè)請(qǐng)求發(fā)生的時(shí)候, 都會(huì)創(chuàng)建一個(gè)接口對(duì)象, 給當(dāng)前請(qǐng)求使用)
- 3.AddScoped (會(huì)話機(jī)制注冊(cè)服務(wù). 也就是在當(dāng)前會(huì)話中, 只會(huì)創(chuàng)建一個(gè)接口對(duì)象. 什么是一個(gè)會(huì)話, 可以簡(jiǎn)單理解為當(dāng)前瀏覽器打開到關(guān)閉, 這個(gè)過程就是一整個(gè)會(huì)話的過程)
那么這里, 我們先使用AddSingleton單例模式注冊(cè)服務(wù), 代碼如下 :
services.AddSingleton<IWelcome, Welcome.Services.Welcome>();
上面提到的三個(gè)方法, 使用方式都一樣, 都是兩個(gè)泛型參數(shù), 第一個(gè)泛型參數(shù)是接口, 第二個(gè)是泛型參數(shù)是接口實(shí)現(xiàn)類.
那么再運(yùn)行一個(gè)我們的程序, 可以看到瀏覽器正常輸出我們的字符串了.
至于上面三個(gè)不同生命周期的注冊(cè)方法, 怎么使用, 看服務(wù)的用途, 一般我推薦使用AddScoped注冊(cè)服務(wù)
到這里, 我們一個(gè)簡(jiǎn)單的服務(wù)就從定義到實(shí)現(xiàn)到注冊(cè)到使用就完成了. 是不是很簡(jiǎn)單呢.
下面我們簡(jiǎn)單講講ASP.Net Core MVC的管道
這里我只會(huì)簡(jiǎn)單講解ASP.Net Core MVC的管道運(yùn)行流程, 不會(huì)講解從監(jiān)聽端口到轉(zhuǎn)發(fā)到ASP.Net Core MVC里面是怎么實(shí)現(xiàn)的
比如我們現(xiàn)在發(fā)起一個(gè)Get請(qǐng)求, 在MVC收到這個(gè)請(qǐng)求的時(shí)候, 我們的管道流程就開始運(yùn)行了, 它會(huì)最先觸發(fā)Logger這個(gè)中間件, 就是日志中間件, 這個(gè)中間件里面可以獲取很多信息, 比如請(qǐng)求頭部信息, 參數(shù)信息等等, 甚至我們可以對(duì)這些信息進(jìn)行修改. 這些信息也會(huì)在控制臺(tái)輸出, 如果用的是dotnet run命令運(yùn)行這個(gè)MVC程序的話, 這里不放截圖了, 你們可以自己試試
在日志中間件執(zhí)行完之后, 就會(huì)執(zhí)行其它的中間件, 如果我們啟用了其它的中間件. 比如我們啟用了身份驗(yàn)證中間件, 那么在日志中間件執(zhí)行完成之后, 就會(huì)執(zhí)行身份驗(yàn)證中間件, 進(jìn)行身份驗(yàn)證, 如果驗(yàn)證成功了, 繼續(xù)下一步處理, 如果驗(yàn)證失敗了, 就做其它處理, 比如重定向到登錄頁面等等.
在這一步執(zhí)行完成之后, MVC管道就會(huì)進(jìn)入路由匹配的過程. 如果匹配成了, 就正常返回HTML或JSON或XML數(shù)據(jù)等等, 如果匹配失敗了, 就404錯(cuò)誤等等.
這就是ASP.Net Core MVC管道的一個(gè)基本流程, 其實(shí)里面做的事情遠(yuǎn)遠(yuǎn)不止這些, 這里就不做深入的講解, 如果有需要, 自行學(xué)習(xí). 因?yàn)橹v一個(gè)真正的管道機(jī)制, 一下子也講不完. 這里的目的只是要大家基本了解ASP.Net Core MVC的基本運(yùn)行流程.
到此這篇關(guān)于ASP.Net Core MVC基礎(chǔ)系列之服務(wù)注冊(cè)和管道的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET中MultiView和View選項(xiàng)卡控件的使用方法
ASP.NET中的MultiView和View控件可以作為承載其他控件的容器,一般我們都很少使用,本文主要介紹使用MultiView和View實(shí)現(xiàn)選項(xiàng)卡效果。2016-04-04asp.net HttpHandler操作Session的函數(shù)代碼
asp.net HttpHandler操作Session的函數(shù)代碼,需要的朋友可以參考下。2011-12-12ASP.net(c#)打造24小時(shí)天氣預(yù)報(bào)及實(shí)時(shí)天氣
ASP.net(c#)打造24小時(shí)天氣預(yù)報(bào)及實(shí)時(shí)天氣...2006-12-12ASP.NET中FileUpload文件上傳控件應(yīng)用實(shí)例
本文主要介紹FileUpload文件上傳控件在實(shí)際開發(fā)中經(jīng)常遇到的問題并給出解決方法,希望對(duì)大家有所幫助。2016-04-04