以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬。(虽然不知道前辈现在在干什么)。一晃就6年过去了,那首 郝云 的《回到那一天》怎么唱来着? 时光一晃,你就三十了。

而我们都变成了老了的程序员

ASP.NET Core在解开了对windows的依懒之后,整个管线都发生了变化 。这个变化是彻底的,原来ASP.NET 中的有些对象直接没有了。被保留下来的,也只是你看起来还差不多,但实现已经完全不一样了。

我们就来说说我认为的这些ASP.NET Core的这些新的核心对象。

WebHost, IServiceCollection,IServiceProvider,IApplicationBuilder,IMiddleware 和 RequestDelegate, IServer和IHttpApplication,

还有一些同样很重要的对象: ILogger, IConfiguration

始于WebHost

WebHost像母亲,它承载和孕育了ASP.NET Core下几乎所有的对象,从代码层面入手来看的话可以说是ASP.NET Core的入口,没有它,后面的一切都没有办法开始。当然如何复杂的一项业务,要做好也不容易,WebHost的启动一共分为四阶段。

  • 准备阶段: var builder = new WebHostBuilder(),然后给WebHostBuilder各种填参数

  • 构建阶段: var host = builder.Builder() , 主要负责依懒注入的初始化,以及host的初始化

  • 启动阶段: host.start();

  • 运行阶段

program.cs

ASP.NET Core 程序基于一个命令行的程序运行,程序的入口在program.cs的main方法。

public static void Main(string[] args){WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build().Run();
}

WebHost是一个internal类,我相信NETCore团队不希望大家随意的去new它,而是通过WebHostBuilder去构建。我们在这里访问的WebHost实际上不是真正的WebHost,真正的WebHost在github的Hosting项目下,命名空间为:Microsoft.AspNetCore.Hosting.Internal。

在ASP.NET Core1x中,我们必须要自己创建WebHostBuilder。

var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();

这些默认的动作未免有些繁琐,后来到了ASP.NET Core2的时候创建了一个新的项目在github上,叫做MetaPackages 并在 Microsoft.AspNetCore的命名空间下创建了一个static class也就是我们现在用到的这个,里面主要的方法就是CreateDefaultBuilder。

CreateDefaultBuilder方法

这个方法负责返回给我们一个WebHostBuilder, 并且调用了以下扩展方法:

  • UseKestrel 使用kestrel server来处理请求

  • UseContentRoot 设置站点目录

  • ConfigureAppConfiguration

  • ConfigureLogging

其实和我们在1X的时候自己构建是一个道理,而这些都是基于WebHostBuilder 的扩展方法它们来自于其它几个不同的组件。

UseKestrel

WebHost负责托管ASP.NET Core,但是它并不真正从服务器网卡上监听端口以及将网络字节转换到.net core的管道。这些由IServer来处理。

这里先简单了解一下这个过程,我们后面会在IServer的环节再详述。我们这里使用的UseKestrel 来自于github上的项目 KestrelHttpServer。

里面的Kestrel项目下有一个WebHostBuilderKestrelExtensions类。里面就是这个 UseKestrel扩展方法的定义:

public static IWebHostBuilder UseKestrel(    this IWebHostBuilder hostBuilder){    return hostBuilder.ConfigureServices(services =>{    // Don't override an already-configured transportservices.TryAddSingleton<ITransportFactory, SocketTransportFactory>();services.AddTransient<IConfigureOptions<KestrelServerOptions>, KestrelServerOptionsSetup>();services.AddSingleton<IServer, KestrelServer>();});
}

其实也很简单,都是在进行Server依赖的配置,因为最终的执行都由WebHost来展控。所以WebHost大量依赖的其它外部组件都被定义成接口放到了HttpAbstractions里面,然后由外部扩展方法(多以Use开头,进行配置)

ASP.NET Core源码里面大量使用扩展方法进行Servier DI的配置,扩展方法定义在各种不同的命名空间以及项目下。如果不习惯或者不了解相关的部分会觉得有些痛苦。

ConfigureAppConfiguration

这个方法专门用来为 WebHostBuilder添加配置,包括appsettings.json的、命令行参数以及环境变量。关于配置这一节我们留在后面具体来讲。

config.AddJsonFile(              "appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);config.AddEnvironmentVariables();config.AddCommandLine(args);

ConfigureLogging

logging也是 ASP.NET Core内置组件中的很重要一个,这个方法在默认已经为我们添加了appsettings中的logging配置以及控制台log。关于日志这一节我们留在后面具体来讲。

logging.AddConfiguration(        hostingContext.Configuration.GetSection("Logging"));logging.AddConsole(); logging.AddDebug();

UseStartup<>

Startup.cs这个类主要做两件事情的配置Service DI和http管道,这些都是在WebHost启动之前就需要确定下来的。而UseStartup就是将我们定义的Startup.cs和 IStartup绑定起来,让WebHost可以找得到。 怎么绑定呢? 当然还是依赖注入:

 if (typeof(IStartup).GetTypeInfo().IsAssignableFrom(startupType.GetTypeInfo()))
{services.AddSingleton(typeof(IStartup), startupType);
} else{services.AddSingleton(typeof(IStartup), sp =>{    var hostingEnvironment = sp.GetRequiredService<IHostingEnvironment>();     return new ConventionBasedStartup(StartupLoader.LoadMethods(sp, startupType, hostingEnvironment.EnvironmentName));});
}

VS为我们添加的Startup.cs默认不继续IStartup接口,所以是采用Convention的这种方式,当然我们也可以继承IStartup则直接注册成单例到应用程序。

以上是整个 WebHostBuilder的准备阶段,即往里面放了很多的参数。下一篇我们将接着讲Builder阶段,给了你那么多,你要开始制造点什么东西给我了

原文地址:http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

我心中的ASP.NET Core 新核心对象WebHost(一)相关推荐

  1. 我心中的ASP.NET Core 新核心对象WebHost(二)

    这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置.我们给WebHostBuilder进行以下配置 UseKest ...

  2. ASP.NET Core 新核心对象WebHost(一)

    以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...

  3. asp.net core新特性(1):TagHelper

    进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...

  4. ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记

    点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHos ...

  5. 送福利 | 送书3本 ASP.NET Core 真机拆解

    小编:最近.NET相关图书在多年沉寂后重新恢复,本书作者提供3本送给公众号粉丝,所以参与方式:文章下方留言,你可以聊聊.NET Core 这几年的发展给你的印象,你的感想,点赞最多的前5位获奖. 活动 ...

  6. 一个迷你ASP.NET Core框架的实现(下)

    [框架内幕]| 作者 / Edison Zhou 这是恰童鞋骚年的第196篇原创文章 上一篇我们了解了AspNetCore.Mini这个项目的背景及项目结构和流程,这一篇我们继续解析几个核心对象.本文 ...

  7. 《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)

    译者序 微服务设计方法清晰定义了各个开发团队的业务边界,微服务框架以不同方式实现了服务之间的协作与集成. .NET Core 作为全新的 .NET 技术,它不仅完全开源.跨平台,更面向云原生开发进行了 ...

  8. 从明面上学习ASP.NET Core

    一.前言     这篇文章就是从能看到地方去学习Core,没有很深奥,也没有很难懂,现在我们开始吧. 二.构建项目,引发思考     创建项目的步骤真的很简单,你要是不会,我真也没法了,我这是创建的M ...

  9. ASP.NET Core依赖注入深入讨论

    这篇文章我们来深入探讨ASP.NET Core.MVC Core中的依赖注入,我们将示范几乎所有可能的操作把依赖项注入到组件中. 依赖注入是ASP.NET Core的核心,它能让您应用程序中的组件增强 ...

最新文章

  1. EntityFrameworkCore 安装
  2. php如何实现省市,PHP简单实现正则匹配省市区的方法
  3. Vue.js生命周期
  4. 教你如何做一次真正有价值的业务数据分析
  5. matlab mysvd代码解释,关于使用SVD进行PCA主成分提取的代码问题!也是必须涉及到原理的!...
  6. ICPC North Central NA Contest 2017 E - Is-A? Has-A? Who Knowz-A?
  7. linux 停止路由转发策略_Linux静态路由
  8. 富士通Fujitsu DPK2089K 打印机驱动
  9. 优秀流程图和逻辑图画法的分析和借鉴
  10. 仿Tumblr点赞心破碎动画
  11. Java中如何判断一个集合中的一个元素不在另一个集合中?把不存在的元素移除
  12. uni-app uni-fab修改图标 浮窗位置 是否展开
  13. IdentityServer4 (IDS4) 快速入门
  14. 华为鲲鹏是芯片还是服务器,关于芯片:眼见为实华为鲲鹏架构服务器生态大揭秘...
  15. python axis到底如何理解?
  16. 七牛云存储详细配置步骤
  17. minikube addons enable ingress 启动错误
  18. ps多边形套索工具按过delete以后点下一个点点不出来
  19. 中国移动规范学习——4A技术要求(账号管理)
  20. 计算机应用稿件改后重审,论文投稿,外审意见是修后再审,修后再审过后,编辑告诉我要再修改然后再审,返回来的稿件是我修后的原稿,这是什么情况。求知道的专家同仁指点迷津...

热门文章

  1. 《移动App测试的22条军规》—第1章1.2节移动App的生命周期
  2. GDUFE ACM-1045
  3. Nats的消息通信模型
  4. javascript高程3 学习笔记(三)
  5. Xamarin效果第四篇之CollectionView子项右侧布局
  6. 在 .NET 6 中使用 DATEONLY 和 TIMEONLY
  7. WTMPlus 低代码平台来了
  8. .NET Core with 微服务 - Consul 配置中心
  9. ABP Framework 研习社经验总结(6.28-7.2)
  10. 如何在 C# 中使用 委托