我在 .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 中某个部分的架构。
最后,将参数扩展到 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 中失败:
Unable to resolve service for type 'WorkerService1DeleteMe.ConfigChunk' while attempting to activate 'WorkerService1DeleteMe.Worker'.
我觉得我错过了一些非常明显的东西,但我必须承认我不知所措。我观察到的是,我可以通过 services.AddSingleton
而不是 services.Configure
来使整个工作正常进行,但我更喜欢 Configure 方法的模式和重新加载功能如果我能让它发挥作用。
最佳答案
可用的选项很少。
与当前配置更新 worker 一起使用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 保持原样并更新配置以允许类本身被注入(inject)。
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);
});
第二个示例将允许显式注入(inject) ConfigChunk
同时仍然允许选项功能生效并且不会将工作人员与框架问题紧密耦合。
关于c# - .NET Core 3 Worker 服务设置依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288674/