.NET Core 3 Worker服务设置依赖项注入

Adr*_*and 1 c# dependency-injection worker

我有以下在.NET Core 2中成功运行的方法,但在.NET Core 3中却无效。

我从头开始制作了一个新的Worker Service .Net Core 3项目,并仅添加了最少的内容来重新创建我的错误。

这是我在Program.cs中的入口

namespace WorkerService1DeleteMe
{
    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) =>
                {
                    services.Configure<ConfigChunk>(hostContext.Configuration.GetSection("ConfigChunk"));
                    services.AddHostedService<Worker>();
                });
    }

    public class ConfigChunk
    {
        public string Server { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此CreateHostBuilder,在此Configure方法中添加了一行代码ConfigChunk,在底部添加了一个新类,以匹配appsettings.json中某个部分的模式。

最后,将参数扩展到Worker构造函数,以使其使用SettingsChunk:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly ConfigChunk _config;

    public Worker(ILogger<Worker> logger, ConfigChunk config)
    {
        _logger = logger;
        _config = config;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如所暗示的那样,这在NET Core 2中可以正常工作,但是在3中它失败,并且:

尝试激活“ WorkerService1DeleteMe.Worker”时,无法解析“ WorkerService1DeleteMe.ConfigChunk”类型的服务。

我觉得自己缺少一些显而易见的东西,但必须承认我茫然。我观察到的是,我可以通过使整个工作正常进行,services.AddSingleton而不是去做,services.Configure但是如果可以的话,我更喜欢Configure方法的模式和重载功能。

Nko*_*osi 5

很少有可用的选项。

与当前配置更新工作者一起使用 IOptions<TOptions>

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly ConfigChunk _config;

    public Worker(ILogger<Worker> logger, IOptions<ConfigChunk> config) {
        _logger = logger;
        _config = config.Value;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
        while (!stoppingToken.IsCancellationRequested) {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者让工作程序保持不变,并更新配置以允许类本身被注入。

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) => {
                services.Configure<ConfigChunk>(hostContext.Configuration.GetSection("ConfigChunk"));
                services.AddHostedService<Worker>();
                services.AddTransient<ConfigChunk>(_ => _.GetRequiredService<IOptions<ConfigChunk>>().Value);

            });
Run Code Online (Sandbox Code Playgroud)

第二个示例将允许显式注入,ConfigChunk同时仍允许选项功能生效,并且不会将工作人员与框架问题紧密联系在一起。