欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.netcore入门22:aspnetcore通用主机

程序员文章站 2024-01-29 18:17:40
...

环境:

  • window 10
  • .netcore 3.1
  • vs2019 16.5.1

参照:
asp.net core 系列 17 通用主机 IHostBuilder

一、什么是通用主机?

通用主机就是微软抽象出来的一个资源容器,它里面包括了配置模型、日志框架、依赖注入容器等。它里面还包括主机服务(IHostedService:存放在依赖注入容器中),这样当通用主机启动或停止的时候实际上就是针对这个主机服务进行开启和停止操作。

二、为什么要有通用主机?

在.net2.x以前我们创建aspnetcore应用是使用WebHost.Create...去创建的,现在我们是使用Host.CreateDefaultBuilder()...去创建的,早先的那种就限制主了aspnetcore只能为http服务使用,如果从我只想开一个定时服务或者是搞个消息队列什么的,那就尴尬了,所以微软抽象出来了通用主机,然后aspnetcore web框架就是在通用主机里注入一个主机服务。

三、Program中的默认生成代码

.netcore入门22:aspnetcore通用主机
可以看到,createBuilder=》build()=》run()都是通用主机的东西,Web服务是在ConfigureWebHostDefaults方法中被注入到通用主机里的

四、测试非web服务的通用主机

新建一个空的web项目,将Program中的代码替换成如下:

public class Program
{
    public static void Main(string[] args)
    {
        Host.CreateDefaultBuilder()
        new HostBuilder()
        .ConfigureServices(services =>
        {
            services.AddLogging();
            services.AddSingleton<IHostedService, MyHostService>();
        })
        .ConfigureLogging(loggingBuilder =>
        {
            loggingBuilder.AddConsole();
        })
        .Build()
        .Run();
        Console.WriteLine("ok");
        Console.ReadLine();
    }
}
public class MyHostService : IHostedService
{
    private readonly ILogger<MyHostService> logger;

    public MyHostService(ILogger<MyHostService> logger)
    {
        this.logger = logger;
    }
    public Task StartAsync(CancellationToken cancellationToken)
    {
        return Task.Factory.StartNew(() =>
        {
            while (true)
            {
                if (cancellationToken.IsCancellationRequested) break;
                logger.LogInformation("MyHostService is Comming...");
                Thread.Sleep(5000);
            }
        });
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        logger.LogInformation("MyHostService is stop!");
        return Task.CompletedTask;
    }
}

直接运行,看控制台输出:
.netcore入门22:aspnetcore通用主机

相关标签: .netcore