10 .NET HostBulider

word文档地址:https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/Windows%20%E5%B9%B3%E5%8F%B0/Net

.NET 的一个重要的概念IHost(主机),其由HostBuilder生成

示例

var builder = new HostBuilder();
// 生成Host
builder.Build()
    // 运行Host
    .Run();

HostBuilder提供的功能

HostBuilder提供了以下功能
1.依赖关系注入容器 (DI)
2.Logging注册
3.Configuration配置注册
4.IHostedService 注册
5.Host生命周期管理

依赖关系注入容器

HostBuilder 提供已了默认的依赖注入容器,如果我们想使用其他依赖注入容器,则可以调用UseServiceProviderFactory替换

var builder = new HostBuilder();
builder.UseServiceProviderFactory(new AutofacServiceProviderFactory());

Logging注册

HostBuilder默认注册了如下日志提供者,如果需要其他日志则需要自己注册
-控制台
-调试
-EventSource
-EventLog(仅当在 Windows 上运行时)
日志的注册五花八门,这里不示例了

Configuration配置注册

我们可以使用如下方法给Host添加配置

builder.ConfigureHostConfiguration((config) =>
{
    // 配置Host的路径
    config.SetBasePath(Directory.GetCurrentDirectory());
    // 添加Json配置文件
    config.AddJsonFile("hostsettings.json", optional: true);
    // 添加环境变量配置
    config.AddEnvironmentVariables(prefix: "PREFIX_");
    // 添加命令行配置
    config.AddCommandLine(args);
    
    Dictionary<string, string> source = new Dictionary<string, string>
    {
        ["format:dateTime:longDatePattern"] = "dddd, MMMM d, yyyy",
        ["format:dateTime:longTimePattern"] = "h:mm:ss tt",
        ["format:dateTime:shortDatePattern"] = "M/d/yyyy",
        ["format:dateTime:shortTimePattern"] = "h:mm tt",
    };
    // 添加内存配置
    config.AddInMemoryCollection(source);
});

IHostedService 注册

我们可以通过如下方法注册IHostedService

builder.ConfigureServices((_, services) =>
{
    services.AddHostedService<ExampleHostedService>()
});

当Host启动时,会调用IHostedService的StartAsync方法,当Host停止时会IHostedService的调用StopAsync方法

HostBuilder注册的服务

HostBuilder注册了以下服务,我们可以通过依赖注入获取

1.IHostApplicationLifetime
通过IHostApplicationLifetime我们可以向Host注册生命周期函数

public class ExampleHostedService
{
    private readonly ILogger _logger;

    public ExampleHostedService(
        ILogger<ExampleHostedService> logger,
        IHostApplicationLifetime appLifetime)
    {
        _logger = logger;
        // Host 启动后
        appLifetime.ApplicationStarted.Register(OnStarted);
        // Host 即将停止
        appLifetime.ApplicationStopping.Register(OnStopping);
        // Host 停止后
        appLifetime.ApplicationStopped.Register(OnStopped);
}

    private void OnStarted()
    {
        _logger.LogInformation("2. OnStarted has been called.");
}

    private void OnStopping()
    {
        _logger.LogInformation("3. OnStopping has been called.");
}

    private void OnStopped()
    {
        _logger.LogInformation("5. OnStopped has been called.");
    }
}

2.IHostLifetime
IHostLifetime用于控制Host何时启动和停止

3.IHostEnvironment
IHostEnvironment保存Host的环境信息

// App 的名称
IHostEnvironment.ApplicationName
// 程序的根目录文件提供器
IHostEnvironment.ContentRootFileProvider
// 程序的根目录
IHostEnvironment.ContentRootPath
// 当前环境(开发开始生产环境)
IHostEnvironment.EnvironmentName

Asp.net core站点与HostBuilder

Asp.net core站点其实就是一个Host,这个Host包含了一个IHostedService(GenericWebHostService),GenericWebHostService监听我们的端口并将请求映射到我们的控制器

builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());

HostBuilder不局限于站点

HostBuilder并不一定要用于站点搭建,还可以用于控制台和后台服务等

示例1:如下我们使用HostBuilder构建控制台应用

namespace TestWeb2
{
    public class MyService : IHostedService
    {
        private IHttpClientFactory _httpClientFactory { get; }

        // 依赖注入 IHttpClientFactory
        public MyService(IHttpClientFactory httpClientFactory) {
            this._httpClientFactory = httpClientFactory;
        }

        public async Task StartAsync(CancellationToken cancellationToken)
        {
            while (true) {
                Console.WriteLine("请输入命令");
                Console.WriteLine("1: 请求 \\ 2: 待开发");
                string cmd = Console.ReadLine();

                if (cmd == "1")
                {
                    Console.WriteLine("执行命令1");
                }
                else {
                    Console.WriteLine("无效的命令");
                }
            }
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
}

    class Program
    {
        static void Main(string[] args)
        {
            IHostBuilder builder = new HostBuilder();
            builder.ConfigureServices(services =>
            {
                services.AddHostedService<MyService>();
            });
            builder.Build().Run();
            Console.WriteLine("程序已退出");
        }
    }
}

示例2:如下是 .NET 后台服务的模板代码

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // 注册Host服务
                services.AddHostedService<Worker>();
            });
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值