Configuring properties from config.json using services.Configure

2.2k views Asked by At

Following on from a StackOverflow question regarding Using IConfiguration globally in mvc6. A comment to the accepted answer suggests using

services.Configure<SomeOptions>(Configuration);

Now this works fine with the following code;

Class

public class SomeOptions
{
    public string MyOption { get; set; }
}

config.json

{
    "MyOption": "OptionValue"
}

Startup.cs

public Startup(IHostingEnvironment env)
{
    Configuration = new Configuration()
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
}

public void ConfigureServices(IServiceCollection services)
{        
    services.Configure<SomeOptions>(Configuration);
}

However the config.json file doesn't have any really structure, and I would like it to look more like;

{
    "SomeOptions": {
        "MyOption": "OptionValue"
    }
}

However this does not bind the values within the class. Is there anyway to allow this?

3

There are 3 answers

1
Mihai Dinculescu On

If you want to change the config.json structure you also need to change your class structure.

{
    "SomeOptions": {
        "MyOption": "OptionValue"
    }
}

maps to something like

public class SomeOptions
{
    public List<MyOption> MyOptions { get; set; }
}

public class MyOption
{
    public string OptionValue { get; set; }
}
1
Master19 On

You can access specific value in config.json like:

Configuration.Get("SomeOptions:MyOption");

Which returns

"OptionValue"

So, your code will be

services.Configure<SomeOptions>(options => 
        options.MyOption = Configuration.Get("SomeOptions:MyOption"));
0
Ryan On
services.Configure<SomeOptions>(Configuration.GetSubKey(nameof(SomeOptions)));

Should do it.