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

4
我有一个控制台应用程序,我正在构建配置。
IConfiguration config = new ConfigurationBuilder()
   .AddJsonFile("appsettings.json", true, true)
   .Build();

var services = new ServiceCollection();
services.AddOptions();
services.Configure<ResourceConfiguration>(config.GetSection("ResourceConfiguration"));

这个不起作用

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

我在代码中(包括我自己的命名空间)使用以下内容:
使用Microsoft.Extensions.Configuration; 使用Microsoft.Extensions.DependencyInjection; 使用System; 使用IO;
IConfiguration config = new ConfigurationBuilder()
   .AddJsonFile("appsettings.json", true, true)
   .Build();

返回IConfigurationRoot可能是问题所在?

我做错了什么?

这是.NET Core 3.1。

Paul


2
你的文件顶部有哪些 using 语句?你的项目中有哪些 NuGet 包? - gunr2171
正如@PanagiotisKanavos所说,您需要进行“转换”,请尝试以下代码:config.GetSection("ResourceConfiguration").Get<ResourceConfiguration>() - Valter
@Valter,那不是我说的。你不能将IConfigurationSection转换为Action。问题的代码很好,与文档示例和我使用的代码完全相同。 - Panagiotis Kanavos
这是实际代码吗?还是ervices.AddOptions().Configure< ResourceConfiguration>()services.Configure<ResourceConfiguration>不会抛出这样的异常。但是,AddOptions返回一个OptionsBuilder,其Configure方法需要一个操作。 - Panagiotis Kanavos
你是否已经包含了 Microsoft.Extensions.Options.ConfigurationExtensions? - Torbjörn Hansson
显示剩余4条评论
2个回答

11

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

请查看下面的代码,并告诉我们它是否有效。 =)

AppSettings.json

{
    "SETUP_OPTIONS": 
    {
        "MyProperty": 100,
        "MyProperty2": "Success!"
    }
}

所需引用

using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using System.IO;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

SetupOptions 类

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

    public int MyProperty { get; set; }
    public string MyProperty2 { get; set; }
}

Program.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>();
}

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

1
你好,SetBasePath参数不正确。我们可以使用类似于Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)或简单的Directory.GetCurrentDirectory()这样的方法。 - AFract
去掉所有的服务内容,代码看起来像这样:myOpts = config.GetSection(SetupOptions.ConfigKey).Get<SetupOptions>()。 - undefined

6
你可能缺少包 Microsoft.Extensions.Options.ConfigurationExtensions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接