如何在 Net Core 6 工作应用程序中使用配置?

ale*_*o73 7 configuration worker .net-core

有关使用配置的所有信息都从创建构建器开始,

var builder = WebApplication.CreateBuilder(args);
Run Code Online (Sandbox Code Playgroud)

随后使用

builder.Configuration.
Run Code Online (Sandbox Code Playgroud)

配置,但在 Worker services WebApplication 中不可用。

如何在 Microsoft.NET.Sdk.Worker 类型的项目中使用配置?

Amr*_*rhy 14

这可能会有所帮助https://medium.com/c-sharp-progarmming/how-to-set-appsettings-or-config-in-a-net-worker-service-cc2d70ab4e0c

这是通过访问 HostBuilderContext

Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            IConfiguration configuration = hostContext.Configuration;
            services.Configure<RabbitMQConfiguration>(configuration.GetSection(nameof(RabbitMQConfiguration)));
            services.AddHostedService<Worker>();
        });
Run Code Online (Sandbox Code Playgroud)


Dar*_*oon 5

首先,您应该添加ConfigureAppConfiguration何时CreateHostBuilder

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<Worker>();
        })
        .ConfigureAppConfiguration((hostContext, configBuilder) =>
        {
            configBuilder
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .Build();
        });
Run Code Online (Sandbox Code Playgroud)

然后,在appsettings中添加配置。你的环境.json

  "worker": {
    "id": 12345,
    "name": "SimpleWorker",
    "delay": 1000
  }
Run Code Online (Sandbox Code Playgroud)

添加IConfiguration构造Worker函数并使用它。

类的完整示例Worker

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly IConfiguration _configuration;

    public Worker(ILogger<Worker> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var workerConfig = _configuration.GetSection("worker").Get<SimpleWorkerConfig>();
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker {id}:{name} running at: {time} with delay {delay}", 
                workerConfig.Id, workerConfig.Name, DateTimeOffset.Now, workerConfig.Delay);
            await Task.Delay(workerConfig.Delay, stoppingToken);
        }
    }
}

public class SimpleWorkerConfig
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Delay { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

结果: 结果