c# - .NET Core 3 Worker 服务设置依赖注入(inject)

标签 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; }
    }
}

所以这里在 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/

相关文章:

c# - 如何在 C# 中使用 SQL 查询从 SQL 数据库中获取表的所有行

java - GWT 延迟绑定(bind)和依赖注入(inject)

c - 如何在eclipse中设置编译 worker (线程)的数量?

multithreading - Service 和 Web Worker 之间的技术差异

c# - 如何设置 DateTime 值的时区(或种类)?

c# - 如何在同一站点的 ashx 和 aspx 文件中使用 await/async?

ios - 依赖注入(inject)的公共(public)属性或自定义初始化程序?

java - 为什么不在 JavaFX Controller 中注入(inject)成员?

javascript - 从数据 URI 创建工作线程

C# 将控制台应用程序挂接到记事本