c# - 将 appsettings 配置 DI 添加到 HostBuilder 控制台应用程序

标签 c# asp.net-core dependency-injection appsettings

我尝试在使用 HostBuilder 的 .NET Core 控制台应用程序中包含 appsettings.json 文件,并尝试添加一个部分 (AppVars)配置。当我尝试执行此操作时,出现错误:

System.InvalidOperationException: Unable to resolve service for type AppVars while attempting to activate...

这是我的代码:

private static async Task Main(string[] args)
{
    var isService = !(Debugger.IsAttached || args.Contains("--console"));

    var config1 = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true)
        .Build();

    var builder = new HostBuilder()
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<FileWriterService>();

            services.Configure<AppVars>(config1.GetSection("AppVars"));

        });

    //...
}

下面我尝试在类中注入(inject) AppVars:

public class FileWriterService : IHostedService, IDisposable
{
    private const string Path = @"d:\TestApplication.txt";

    private Timer _timer;
    private AppVars _appVars;
    public FileWriterService(AppVars appVars)
    {
       //_appVars = appVars;
    }


    //...

}

最佳答案

 services.Configure<AppVars>(config1.GetSection("AppVars"));

寄存器IOptions<AppVars>而构造函数期望的只是 AppVars

相应地更新目标构造函数,以便它需要正确的类型

public class FileWriterService : IHostedService, IDisposable {
    private const string Path = @"d:\TestApplication.txt";

    private Timer _timer;
    private AppVars _appVars;
    public FileWriterService(IOptions<AppVars> appVars) {
       _appVars = appVars.Value;
    }

    //...

}

或者

保留构造函数不变,并重构启动以注册所需的类型

var builder = new HostBuilder()
    .ConfigureServices((hostContext, services) => {
        services.AddHostedService<FileWriterService>();
        AppVars appVars = hostContext.Configuration.GetSection("AppVars").Get<AppVars>();
        services.AddSingleton(appVars);

    });

关于c# - 将 appsettings 配置 DI 添加到 HostBuilder 控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59274418/

相关文章:

c# - WebApi 服务中的 [FromUri] 属性忽略了 DataMember 的 Name 属性

asp.net-core - 区分大小写的路由

java - Spring在条件类的子类中注入(inject)bean

c# - 使用 Unity.Mvc5 注入(inject)依赖项时的多个 Controller 构造函数

c# - 如何停止Azure Durable函数上的并行执行?

c# - 懒惰地创建隔离存储

c# - 使用授权 header 重定向到操作

c# - 在 HttpClient 中使用受信任的根证书颁发机构进行服务器证书验证

php - 如何在 Yii2 中将接口(interface)注入(inject) Controller 的构造函数

c# - 将文件从 C# Windows 窗体中的文件夹填充到列表框中