理解 ASP.NET Core: Host

本文深入解析 ASP.NET Core 中的 Host,包括 Host 的生命周期管理、IHostApplicationLifetime 的应用,以及如何启动和停止服务。通过分析 Program.cs 文件,阐述 Host 如何作为整个应用程序的基石,管理 IHostedService 并提供应用程序生命周期管理。
摘要由CSDN通过智能技术生成

dotnet core 非常好用,代码也及其精炼,但是,你真的搞懂了每一行代码背后的含义了吗?

本文希望能够深入浅出地梳理一下它的脉络,把它从神秘变成水晶一般透明。

本文关注于分析 Pragram.cs 代码文件,深入分析其中的 Host 宿主处理机制。

新创建 Web 应用程序

使用下面的命令可以快速创建一个 dotnet core 的 Web 应用。

dotenet new web -n HelloWeb

生成的 Program.cs 中源代码如下所示:

namespace HelloWeb
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Main 方法调用了自定义的 CreteaHostBuilder() 方法来得到一个 IHostBuilder 对象实例,并在调用其 Build() 方法来得到实际的 Host 对象,然后调用 Host 对象实例的 Run() 方法开始应用的执行过程。

在这个 CreateHostBuilder() 方法中,通过 Host 类型的静态方法 CreateDefaultBuilder() 来得到 IHostBuilder 对象实例,并调用了此对象实例的 ConfigureWebHostDefaults() 方法。此方法返回的仍然是 IHostBuilder 实例本身。

通过类型名称可以看出,这里使用了构建模式,这个 IHostBuilder 对象是用来构建一个 IHost 对象实例的,Build() 方法即构建出一个 IHost 对象实例,然后的 Run() 方法是调用了 IHost 对象实例的方法。

作为学习 Host 的第一篇文章,我们先关注 Host 本身,以后我们再看 IHostBuilder 是怎样构建这个 Host 对象实例的。

Host

我们就从 Host 开始。

Host 本身作为整个应用程序的基石,主要作用是用来管理寄宿在自身之上的 IHostedService,负责把注册的这些服务启动起来,并提供应用程序的生命周期管理。

具体注册了哪些服务,其实是通过 IHostBuilder 来完成的,所以,对于 Host 本身来说,并没有提供多少扩展点,我们主要是理解它提供的功能为主。

在 ASP.NET Core 中,Host 是整个应用的基石,Web 应用也是作为一个服务是寄宿在这个 Host 之上的。所以,我们先跳过 IHostBuilder,首先从 IHost 开始。

Host 使用接口 IHost 定义,此接口的定义很简洁,可以在 GitHub 中查看 IHost 源码

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Microsoft.Extensions.Hosting
{
    /// <summary>
    /// A program abstraction.
    /// </summary>
    public interface IHost : IDisposable
    {
        IServiceProvider Services { get; }

        Task StartAsync(CancellationToken cancellationToken = default);
        Task StopAsync(CancellationToken cancellationToken = default);
    }
}

其中 类型为 IServiceProvider 的 Services 用来提供依赖注入的支持,我们有专门介绍依赖注入的文章,请参考这里,这里我们需要知道的就是,可以通过它来获取对象实例。

两个方法分别用来启动服务和停止服务。服务这个词在 .NET Core 中在不同的场景下,有不同的含义,这里指的服务是 IHostedService 服务,也就是寄宿在 Host 中的服务,启动服务就是调用 IHostedService 对象的启动方法,而停止服务也就是调用这些服务的停止方法。

这些服务很可能运行在不同的线程之上,我们怎么通知一个线程优雅地结束掉,而不是粗暴地直接取消呢?在多线程模式下,我们一般会传递一个 CancellationToken 对象进去,通过它实现线程之间的通知。

不要被名字中的 Cancelation 所迷惑,它并不是仅仅用来取消操作的,更多的时候,是用来在多线程场景下,在不同的线程之间进行事件通知的。我们也会专门介绍这个 CancellationToken,这里先不深入进行了。

除了核心的 StartAsync() 和 StopAsync() 方法,另外,在 Host 的扩展方法定义 HostingAbstractionsHostExtensions 中,又定义了一组辅助方法:

  • void Run(this IHost host)
  • async Task RunAsync(this IHost host, CancellationToken token = default)
  • void Start(this IHost host)
  • Task StopAsync(this IHost hos
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值