Search code examples
c#dependency-injectionconfigconfiguration-files

Cannot use IOptions in console app .NET Core


I have a console application where I am building up the configuration

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

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

This doesnt work

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

I have the following in my using (as well as my own namespaces)

using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.IO;

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

Returns IConfigurationRoot which may be the issue?

What am I doing wrong?

This is .NET Core 3.1

Paul


Solution

  • I have created a console app using .NET 6 to help you out.

    Check the code below and let us know if it worked. =)

    AppSettings.json

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

    usings required

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

    SetupOptions class

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