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方法的模式和重载功能。
很少有可用的选项。
与当前配置更新工作者一起使用 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同时仍允许选项功能生效,并且不会将工作人员与框架问题紧密联系在一起。