.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<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);
或者让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以上是关于.NET Core 3 Worker 服务设置依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务
[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务
Net Core Worker Windows 服务中的 EF Core DBContext