无法在控制台应用程序 .NET Core 中使用 IOptions

Pau*_*aul 4 c# dependency-injection config configuration-files

我有一个控制台应用程序,我正在其中构建配置

IConfiguration config = new ConfigurationBuilder()
   .AddJsonFile("appsettings.json", true, true)
   .Build();

var services = new ServiceCollection();
services.AddOptions();
services.Configure<ResourceConfiguration>(config.GetSection("ResourceConfiguration"));
Run Code Online (Sandbox Code Playgroud)

这不起作用

  Error CS1503: Argument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<ResourceConfiguration>' (29, 55)
Run Code Online (Sandbox Code Playgroud)

我的使用中有以下内容(以及我自己的命名空间)

使用 Microsoft.Extensions.Configuration;使用 Microsoft.Extensions.DependencyInjection;使用系统;使用系统.IO;

IConfiguration config = new ConfigurationBuilder()
   .AddJsonFile("appsettings.json", true, true)
   .Build();
Run Code Online (Sandbox Code Playgroud)

返回 IConfigurationRoot 这可能是问题所在?

我究竟做错了什么?

这是.NET Core 3.1

保罗

Kev*_*ero 12

我使用 .NET 6 创建了一个控制台应用程序来帮助您。

检查下面的代码并让我们知道它是否有效。=)

应用程序设置.json

{
    "SETUP_OPTIONS": 
    {
        "MyProperty": 100,
        "MyProperty2": "Success!"
    }
}
Run Code Online (Sandbox Code Playgroud)

所需用途

using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using System.IO;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
Run Code Online (Sandbox Code Playgroud)

设置选项类

public class SetupOptions
{
    public const string ConfigKey = "SETUP_OPTIONS";

    public int MyProperty { get; set; }
    public string MyProperty2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

程序.cs

static async Task Main(string[] args)
{
    IConfiguration configuration = new ConfigurationBuilder()
        .SetBasePath(currentDirectory)
        .AddJsonFile("appsettings.json", optional: false)
        .Build();

    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection, configuration);

    var serviceProvider = serviceCollection.BuildServiceProvider();

    await serviceProvider.GetService<MyAppClass>().RunAsync(args);
}

private static void ConfigureServices(ServiceCollection serviceCollection, IConfiguration configuration)
{
    // AppSettings IOptions configuration
    serviceCollection.AddOptions<SetupOptions>().Bind(configuration.GetSection(SetupOptions.ConfigKey));

    serviceCollection.AddTransient<MyAppClass>();
}
Run Code Online (Sandbox Code Playgroud)

MyAppClass.cs

public class MyAppClass
{
    private readonly SetupOptions _setupOptions;

    // Inject IOptions in your constructor
    public MyAppClass(IOptions<SetupOptions> setupOptions)
    {
        _setupOptions = setupOptions?.Value;
    }

    public async Task RunAsync(string[] args)
    {
        // Use your Setup Options value loaded from appsettings file.
        var myPropertyValue = _setupOptions.MyProperty;
    }
}
Run Code Online (Sandbox Code Playgroud)


Tor*_*son 6

您可能丢失了包裹Microsoft.Extensions.Options.ConfigurationExtensions