ZetCode

ASP.NET IHostBuilder

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 IHostBuilder 接口。该接口对于配置和构建 .NET 通用主机至关重要。

ASP.NET Core 应用程序使用 IHostBuilder 来设置服务、配置和应用程序的生命周期。它提供了一种一致的方式来构建主机应用程序。

基本定义

IHostBuilder 是 .NET 中的一个接口,它提供了配置和构建主机实例的方法。它是 Microsoft.Extensions.Hosting 命名空间的一部分。

主机负责应用程序的启动和生命周期管理。IHostBuilder 允许配置服务、日志记录、配置和依赖注入。

在 ASP.NET Core 中,WebApplication.CreateBuilder() 内部使用 IHostBuilder。它会创建一个具有 Web 特定默认设置的主机,同时允许进行自定义。

ASP.NET IHostBuilder 示例

以下示例演示了如何使用 IHostBuilder 创建自定义主机。

Program.cs
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

var hostBuilder = Host.CreateDefaultBuilder(args);

hostBuilder.ConfigureServices((context, services) =>
{
    services.AddHostedService<WorkerService>();
    services.AddSingleton<IMessageService, MessageService>();
    
    if (context.HostingEnvironment.IsDevelopment())
    {
        services.AddTransient<IDevice, SimulatedDevice>();
    }
    else
    {
        services.AddTransient<IDevice, PhysicalDevice>();
    }
});

hostBuilder.ConfigureLogging(logging =>
{
    logging.ClearProviders();
    logging.AddConsole();
    logging.AddDebug();
});

hostBuilder.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.AddJsonFile("appsettings.json", optional: true);
    config.AddEnvironmentVariables();
    
    if (args != null)
    {
        config.AddCommandLine(args);
    }
});

using var host = hostBuilder.Build();
await host.RunAsync();

public class WorkerService : BackgroundService
{
    private readonly IMessageService _messageService;
    private readonly ILogger<WorkerService> _logger;

    public WorkerService(IMessageService messageService, 
        ILogger<WorkerService> logger)
    {
        _messageService = messageService;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await _messageService.SendMessageAsync("Hello from worker!");
            await Task.Delay(1000, stoppingToken);
        }
    }
}

public interface IMessageService
{
    Task SendMessageAsync(string message);
}

public class MessageService : IMessageService
{
    public Task SendMessageAsync(string message)
    {
        Console.WriteLine($"Message sent: {message}");
        return Task.CompletedTask;
    }
}

public interface IDevice { }
public class SimulatedDevice : IDevice { }
public class PhysicalDevice : IDevice { }

此示例展示了一个完整的控制台应用程序,该应用程序使用 IHostBuilder 创建 .NET 通用主机。该主机包含服务、日志记录和配置。

CreateDefaultBuilder 方法会创建一个具有默认设置的主机生成器。然后,我们在单独的方法调用中配置服务、日志记录和应用程序配置。

该示例通过注册不同的服务来演示依赖注入。它显示了针对开发和生产环境的特定于环境的服务注册。

WorkerService 是一个连续运行的后台服务。它使用依赖注入来获取 IMessageService 和日志记录器。

这种模式对于长时间运行的服务、工作进程或任何需要依赖注入和配置管理的应用程序都很有用。

来源

Microsoft 通用主机文档

在本文中,我们探讨了 ASP.NET 8 中的 IHostBuilder 接口。这一强大功能提供了一种一致的方式来构建和配置 .NET 主机。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程