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

Posted

技术标签:

【中文标题】.NET Core 3 Worker 服务设置依赖注入【英文标题】:.NET Core 3 Worker Service Settings Dependency Injection 【发布时间】:2020-02-05 21:04:05 【问题描述】:

我有以下在 .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; 
    

所以这里在CreateHostBuilder 中添加了一行,添加到Configure 方法中,并在底部添加了一个新的ConfigChunk 类,以匹配appsettings.json 中某个部分的架构 em>。

最后,将参数扩展至 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);
        
    

正如所提到的,这在 NET Core 2 中运行良好,但在 3 中它失败了:

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

我觉得我错过了一些非常明显的东西,但必须承认我不知所措。我观察到的是,我可以通过使用 services.AddSingleton 而不是 services.Configure 来完成整个工作,但如果我可以使其工作,我更喜欢 Configure 方法的模式和重新加载功能。

【问题讨论】:

【参考方案1】:

可用的选项很少。

与当前配置更新工作者一起使用IOptions&lt;TOptions&gt;

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);
        
    

或者让worker保持原样并更新配置以允许注入类本身。

    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);

            );

第二个示例将允许显式注入 ConfigChunk,同时仍允许选项功能生效,并且不会将工作线程与框架问题紧密耦合。

【讨论】:

哇,那位好搭档,非常感谢您,工作愉快! 这帮助我将状态对象注入到组合的 worker/webapi 项目中,从而使 worker 服务状态信息能够通过 webapi 公开。谢谢。 所以我使用的是:IConfiguration configuration = hostContext.Configuration;配置 appConfiguration = configuration.GetSection("AppSettings").Get(); services.AddSingleton(appConfiguration);这对我来说很好,当我将它切换为使用示例 services.Configure(hostContext.Configuration.GetSection("AppSettings")); 中的 IOptions 时它没有从 appSettings.json 加载我的 AppSettings 部分。我在这里想念什么?这也支持 appSettings.Development.json 和 appSettings.Production.json,改变文件重新加载呢? 我可以在这里回答我自己的问题 ***.com/questions/58609652/… 看看 .ConfigureAppConfiguration((hostContext, config) 部分,这回答了我关于可选和重新加载的所有问题,也让我的工作正常。

以上是关于.NET Core 3 Worker 服务设置依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

集成测试 .NET Core 3 Worker

[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

Net Core Worker Windows 服务中的 EF Core DBContext

.net core 5 worker 服务的无密码连接字符串

.net core Windows Service vs Worker 模板