青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

如何一秒鐘從頭構(gòu)建一個(gè) ASP.NET Core 中間件

如何一秒鐘從頭構(gòu)建一個(gè) ASP.NET Core 中間件

前言

其實(shí)地上本沒有路,走的人多了,也便成了路。 -- 魯迅

就像上面魯迅說的那樣,其實(shí)在我們開發(fā)中間件的過程中,微軟并沒有制定一些策略或者文檔來約束你如何編寫一個(gè)中間件程序, 但是其中卻存在者一些最佳實(shí)踐的方法,大多數(shù)人來使用這種方法來使應(yīng)用程序變得更加容易理解并且易于維護(hù),這就叫“路”,在2017年,這叫套路。

在掌握了這些套路之后,能夠幫助你迅速的搭建一個(gè)中間件的基本框架,并且易于擴(kuò)展和維護(hù),下面我們就來看看怎么樣從頭開始開發(fā)一個(gè)中間件吧。

如果你對(duì) ASP.NET Core HTTP 管道還不太清楚的話,下面這篇文章將有助于你對(duì)其進(jìn)行一個(gè)系統(tǒng)的了解:
http://www.cnblogs.com/savorboard/p/aspnetcore-http-pipeline.html

Getting Started

說明: 這只是通常情況下,具體的情況還請(qǐng)使用具體的套路。

Setup 1 創(chuàng)建擴(kuò)展類

如果你的中間件需要一個(gè)向 ASP.NET Core 的 DI 容器中添加默認(rèn)的一些服務(wù)的話,那么你就編寫一個(gè)需要擴(kuò)展類,用來在 Startup.cs 中的 ConfigureServices 中注冊(cè)服務(wù)。

舉例,Microsoft.AspNetCore.ResponseCompression 這是一個(gè)用來壓縮請(qǐng)求內(nèi)容的一個(gè)中間件,那么它就需要一個(gè)服務(wù)用來處理壓縮相關(guān)的東西,所以它擴(kuò)展了 IServiceCollection 并且添加了自己的 Services。

整個(gè)中間件的核心代碼并非在這里,這里只是一個(gè)開始,那么有同學(xué)可能會(huì)問了,什么情況下我們需要提前向一個(gè)DI里面注入我們中間件需要的服務(wù)呢? 答案是,如果你不知道或者不確定你需要什么樣的服務(wù)的時(shí)候,跳過此步驟,進(jìn)入下一步,再等你需要的時(shí)候再回頭來補(bǔ)上就是。

那么,我們先看一下編寫一個(gè)擴(kuò)展Service的靜態(tài)類應(yīng)該怎么做?

首先,新建一個(gè)以 xxxServicesExtensions 文件名結(jié)尾的靜態(tài)類,用來編寫注入DI的擴(kuò)展方法。

類建立完成之后,需要向里面添加內(nèi)容了。通常情況下,中間件中 Service 的擴(kuò)展方法都是以 Addxxx(this IServiceCollection services) 開頭來命名。在這里有一個(gè)需要注意的地方就是它的命名空間,通常情況下我們使用 using Microsoft.AspNetCore.Builder 這個(gè)命名空間。

然后,方法里面就是需要注冊(cè)的服務(wù)了。假設(shè)我們需要向里面注冊(cè)一個(gè) IResponseCompressionProvider 和 它的實(shí)現(xiàn)類 ResponseCompressionProvider,那么最終的擴(kuò)展方法可能看起來是這樣的。


using System;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace Microsoft.AspNetCore.Builder
{
    public static IServiceCollection AddResponseCompression(this IServiceCollection services)
    {
        if (services == null)
        {
            throw new ArgumentNullException(nameof(services));
        }
    
        services.TryAddSingleton<IResponseCompressionProvider, ResponseCompressionProvider>();
        return services;
    }
}
Setup 2 創(chuàng)建配置類

有的時(shí)候,用戶在使用我們編寫的中間件的時(shí)候,我們需要向提供者提供一些配置項(xiàng),這些配置項(xiàng)在中間件執(zhí)行之前用來傳遞一些必要參數(shù)信息或者是一些設(shè)置信息。舉個(gè)我們熟悉例子,我們?cè)谑褂?MVC 中間件的時(shí)候,可能會(huì)看到以下寫法:


// Startup.cs
public void ConfigureServices(IServiceCollection services) 
{
  var userDefinedFilter = new xxxFilter();
  services.AddMvc(x => x.Filters.Add(userDefinedFilter));
 
}

可以看到,用戶可將一些自定義的 Filter 傳入到中間件的,然后中間件在運(yùn)行的時(shí)候,我們傳入的 Filter 就生效了。

注意,中間件使用的配置項(xiàng)有兩種添加方法,一種是添加到 AddMiddleware(Action<xxxOptions> option) 另外一種是 UseMiddleware<>(Action<xxxOptions> option),那么這兩種有什么區(qū)別呢?
那么,前者Add中的配置項(xiàng)一般情況下是中間執(zhí)行之前就需要的一些信息,也就是說中間件的啟動(dòng)就依賴于這些配置項(xiàng),他放置于容器配置(Add DI Service)的時(shí)候添加進(jìn)去更加方便或者合適的時(shí)候使用它,另外一種(后者)是容器已經(jīng)構(gòu)建完畢,不需要依賴于容器提供的配置項(xiàng)可以使用此種方式。

同樣的道理,當(dāng)你自己為你的用戶編寫一個(gè)中間件的時(shí)候,當(dāng)你也需要用戶可以自定義一些配置或者需要傳入一些參數(shù)的時(shí)候,你也可以這么做。那到底怎么樣做呢? 我們一起來看看。

首先,我們需要一個(gè) xxxOptions 結(jié)尾的配置類,用來配置我們中間件需要的一些配置項(xiàng)。我們還是以上面的壓縮中間件舉例。

public class GzipCompressionProviderOptions : IOptions<GzipCompressionProviderOptions>
{
  public CompressionLevel Level { get; set; } = CompressionLevel.Fastest;
  
   GzipCompressionProviderOptions IOptions<GzipCompressionProviderOptions>.Value => this;
}

它其中配置了一個(gè)壓縮的等級(jí) CompressionLevel ,這是一個(gè)枚舉字段。 然后我們可以看到,這個(gè)類它繼承了 IOptions<out T> 接口,這是一個(gè)知識(shí)點(diǎn),什么意思呢? IOptions<out TOptions> 是 ASP.NET Core 新的一個(gè)配置體系里面的一個(gè)接口,當(dāng)你實(shí)現(xiàn)這個(gè)接口之后,ASP.NET Core DI 容器提供了了一個(gè) services.Configure<xxxOptions> 這樣的方法來讓你把配置項(xiàng)注入到容器中,當(dāng)然你也可以將配置項(xiàng)和 appsetting.json 中的配置關(guān)聯(lián)起來,以便于配置一些在運(yùn)行期可能需要變動(dòng)信息。更多關(guān)于 IOptions<T> 的信息可以看 這里的翻譯

這個(gè) xxxOptions 類通常情況下會(huì)提供一些默認(rèn)值,也就是說當(dāng)用戶不提供這些參數(shù)的時(shí)候,你需要有一個(gè)合理的機(jī)制或者默認(rèn)值來正常運(yùn)行你的中間件。

假如你的配置項(xiàng)有很多,也就是說還有進(jìn)一步比較細(xì)化的配置,那么你可以做一個(gè)封裝,就像MVC的Options類一樣,這樣能夠給你的中間件提供更加合理的維護(hù)和擴(kuò)展。

Setup 3 核心中間件

接下來,就是我們的核心代碼類了,通常情況下會(huì)有一個(gè) xxxMiddleware 結(jié)尾的類用來處理 HTTP 管道請(qǐng)求中的一些業(yè)務(wù),這個(gè)類的構(gòu)造函數(shù)中已經(jīng)可以使用在Setup1或者Setup2中向DI容器中注冊(cè)的服務(wù)了。

按照約定,Middleware 類中需要有一個(gè) Invoke 方法,用來處理中間件的核心業(yè)務(wù),它的簽名如下:


public Task Invoke(HttpContext httpContext);

注意,這是一個(gè)約定方法,并沒有接口來約束它。在 Invoke 方法中,是中間件實(shí)現(xiàn)的核心代碼。 示例如下:

public class xxxMiddleware
{
    private readonly RequestDelegate _next;
    
    public xxxMiddleware(RequestDelegate next)
    {
        if (next == null)
        {
            throw new ArgumentNullException(nameof(next));
        } 
        _next = next;
    }
    
    public async Task Invoke(HttpContext context)
    {
       // ......
       await _next(context);
       return;
    }
}

xxxMiddleware 這個(gè)里面有一個(gè)構(gòu)造函數(shù)參數(shù) RequestDelegate,它是一個(gè)委托,代表的需要執(zhí)行的下一個(gè)中間件,通常情況下我們會(huì)把它放到我們業(yè)務(wù)代碼的末尾。

Setup 4 中間件擴(kuò)展注冊(cè)

中間件有三種注冊(cè)方法(Run,Map,Use),我們暫不考慮Run和Map,因?yàn)樗麄冎贿m用于很小和少的一些情況

完成了以上工作后,接下來,我們需要把中間件注冊(cè)到我們的 ASP.NET Core 的執(zhí)行,這個(gè)時(shí)候我們需要一個(gè) xxxBuilderExtensions 類,它也是一個(gè)靜態(tài)類,注意它的命名空間通常為
Microsoft.AspNetCore.Builder,因?yàn)檫@個(gè)用戶在使用我們的中間件的時(shí)候就不必再添加額外的命令空間,依靠 Visual Studio 的智能提示就可以很快速的搜索到。我們來看一下示例:


using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace Microsoft.AspNetCore.Builder
{
    public static class xxxBuilderExtensions
    {
        public static IApplicationBuilder UseResponseCompression(this IApplicationBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            return builder.UseMiddleware<xxxMiddleware>();
        }
    }
}
Yeoman 一秒鐘

有同學(xué)可能會(huì)說了,這些套路既然是這樣的,那么有沒有什么代碼生成工具來幫我做這些事情呢?答案是肯定的。

博主已經(jīng)幫你們把工具做好了,它使用的是當(dāng)今最流行的腳手架工具 npm 中的 Yeoman 。使用它可以幫助你迅速的搭建一個(gè)中間件解決方案代碼模板,讓你專注于業(yè)務(wù)開發(fā)。

我已經(jīng)把這個(gè)模板上傳于 Yeoman 的倉庫中,你只需要按照如下命令就可以幫你自動(dòng)生成一套 ASP.NET Core 中間件解決方案代碼模板了,當(dāng)然單元測(cè)試也包含其中。

npm 工具的安裝相信你自己可以的。下面是安裝 Yeoman 工具和博主的模板工具。

// 安裝 Yeoman 腳手架工具  -g 命令為全局安裝
npm install -g yo

// 安裝博主的 Yeoman(ASP.NET Core Middleware)模板
npm install -g generator-aspnetcore-middleware

然后選擇你需要生成解決方案的文件夾,使用如下命令生成。


yo aspnetcore-middleware

注意:生成的過程中需要輸入你中間件的名稱。按要求輸入即可。

總結(jié)

本篇文章主要講述了從頭創(chuàng)建一個(gè) ASP.NET Core 的流程,這適用于大多數(shù)場(chǎng)合,但是并不代表所有的場(chǎng)合,在實(shí)際開發(fā)的過程中還需要具體的考慮一下。接著博主提供了一個(gè)yo自動(dòng)化腳手架模板用來快速創(chuàng)建一個(gè)中間件解決方案。

如果你覺得這篇文章對(duì)你有幫助的話,謝謝你的【推薦】。

如果你對(duì) .NET Core 感興趣可以關(guān)注我,我會(huì)定期在博客分享關(guān)于 .NET Core 的學(xué)習(xí)心得。


本文地址:http://www.cnblogs.com/savorboard/p/generator-aspnetcore-middleware.html
作者博客:Savorboard
歡迎轉(zhuǎn)載,請(qǐng)?jiān)诿黠@位置給出出處及鏈接

posted on 2017-02-27 08:43 FongLuo 閱讀(1479) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2017年2月>
2930311234
567891011
12131415161718
19202122232425
2627281234
567891011

導(dǎo)航

常用鏈接

留言簿

隨筆分類(11)

隨筆檔案(79)

文章檔案(1)

收藏夾(38)

學(xué)習(xí)網(wǎng)站

一般網(wǎng)站

最新隨筆

搜索

積分與排名

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产日产欧美一区| 亚洲人屁股眼子交8| 国产精品一区三区| 久久这里只有| 久久久www成人免费精品| 久久久久久久久久久成人| 亚洲影院免费观看| 免费视频最近日韩| 蜜臀久久99精品久久久久久9| 午夜在线不卡| 欧美在线播放视频| 久久午夜精品一区二区| 久久久精品日韩| 裸体歌舞表演一区二区| 看片网站欧美日韩| 你懂的网址国产 欧美| 欧美日韩国产影院| 国产啪精品视频| 国产一区二区三区免费观看| 久久综合影视| 亚洲狠狠婷婷| 性欧美1819性猛交| 老牛国产精品一区的观看方式| 老司机久久99久久精品播放免费| 欧美大胆a视频| 国产情人节一区| 99精品国产在热久久下载| 午夜日韩在线观看| 亚洲福利在线看| 香蕉av777xxx色综合一区| 欧美第一黄网免费网站| 国产一区二区精品久久91| 亚洲精品四区| 欧美成年人网| 亚洲伊人第一页| 欧美激情影院| 亚洲高清在线视频| 久久精品动漫| 欧美亚洲视频在线观看| 欧美视频在线观看免费| 欧美一区二区三区免费观看视频 | 国产主播喷水一区二区| 日韩天堂在线观看| 亚洲国产日韩欧美在线99| 欧美成人午夜| 午夜精品一区二区三区在线视| 欧美在线黄色| 亚洲欧美日韩在线不卡| 开元免费观看欧美电视剧网站| 亚洲婷婷在线| 嫩草成人www欧美| 欧美中文字幕视频| 久久男人资源视频| 亚洲电影下载| 亚洲一区二区在线看| 国产专区欧美专区| 欧美在线观看视频一区二区| 国产真实久久| 亚洲精品美女在线观看播放| 国产精品久久国产愉拍| 你懂的国产精品永久在线| 国产精品毛片| 亚洲美女视频在线观看| 国产一区日韩一区| 99精品99| 一区二区三区鲁丝不卡| 午夜视频久久久| 日韩视频免费观看高清在线视频| 欧美一区二区视频网站| 亚洲视频一二三| 欧美国产91| 蜜桃久久精品乱码一区二区| 国产一区二区你懂的| 久久国产精品久久久久久| 亚洲一区在线观看免费观看电影高清| 亚洲永久在线| 亚洲香蕉视频| 国产精品日韩欧美一区二区三区 | 国产主播一区二区三区| 欧美成人福利视频| 国产日韩欧美不卡| 欧美一区亚洲二区| 久热精品在线视频| 91久久香蕉国产日韩欧美9色| 久久久久中文| 国产精品国产三级欧美二区| 亚洲黄网站黄| 亚洲综合日韩在线| 国产精品嫩草影院一区二区| 亚洲一区二区三区四区五区黄 | 国产精品国产亚洲精品看不卡15| 欧美激情二区三区| 亚洲精品一区二区在线观看| 欧美手机在线视频| 午夜久久久久久| 亚洲国产精品成人| 午夜亚洲伦理| 亚洲第一在线视频| 国产精品啊v在线| 久久av在线| 一区二区三区欧美成人| 欧美亚洲免费高清在线观看| 91久久精品国产91久久性色| 黄色日韩精品| 国产啪精品视频| 欧美午夜视频| 欧美精品免费视频| 嫩草影视亚洲| 老色批av在线精品| 欧美一区二区三区在| 亚洲欧美国产日韩中文字幕| aⅴ色国产欧美| 亚洲自拍偷拍一区| 久久综合99re88久久爱| 欧美另类变人与禽xxxxx| 国产三级欧美三级日产三级99| 亚洲电影免费观看高清完整版在线 | 欧美亚洲专区| 亚洲国产精品福利| 精品成人一区二区三区| 国内精品免费午夜毛片| 精品电影在线观看| 国产视频精品va久久久久久| 国产农村妇女毛片精品久久麻豆| 欧美性做爰毛片| 国产在线欧美| 亚洲精品久久久久久一区二区| 夜夜嗨av一区二区三区网页 | 老司机67194精品线观看| 老色批av在线精品| 国产精品日日摸夜夜摸av| 国产中文一区二区三区| 99精品视频一区| 欧美高清视频www夜色资源网| 久久视频在线看| 可以免费看不卡的av网站| 久久久久国产精品人| 狠狠色综合色区| 女人天堂亚洲aⅴ在线观看| 另类亚洲自拍| 免费日韩成人| 国产亚洲精品高潮| 欧美在线观看一二区| 亚洲国产小视频在线观看| 性色一区二区| 国产精品久久久久久亚洲毛片| 亚洲电影专区| 媚黑女一区二区| 亚洲一区二区三区高清| 国产欧美 在线欧美| 久久偷窥视频| 欧美国产激情二区三区| 亚洲一区二区三区免费观看| 亚洲欧美一区二区三区极速播放| 国产人妖伪娘一区91| 欧美顶级少妇做爰| 国产精品久久福利| 麻豆freexxxx性91精品| 欧美日韩在线播放一区| 久久综合九色综合欧美狠狠| 亚洲精品日韩激情在线电影| 亚洲亚洲精品在线观看| 亚洲黄色免费网站| 亚洲精品久久在线| 巨胸喷奶水www久久久免费动漫| 久久综合九色综合网站| 亚洲免费在线看| 亚洲国产高清在线观看视频| 亚洲综合色网站| 免费成人小视频| 欧美日韩国产综合在线| 国产精品午夜春色av| 日韩午夜激情电影| 蜜臀久久99精品久久久久久9 | 一区二区激情视频| 久久久久在线| 浪潮色综合久久天堂| 亚洲国产第一页| 欧美黄色免费网站| 亚洲免费在线视频一区 二区| 欧美大尺度在线观看| 亚洲欧美中文字幕| 激情视频一区| 国产精品久久久| 久久久午夜视频| 亚洲国产精品久久久| 亚洲欧美日本伦理| 亚洲二区在线观看| 国产精品高潮粉嫩av| 可以看av的网站久久看| 亚洲免费影视第一页| 亚洲黄色性网站| 美女福利精品视频| 性做久久久久久免费观看欧美| 亚洲国产精品久久久久| 国产一区二区丝袜高跟鞋图片| 欧美日韩视频在线第一区| 久久综合伊人77777蜜臀| 亚洲欧美在线免费观看| 亚洲视频在线观看三级|