.NET Core 2.2 configs
Config files in .NET Core 2.2
.NET Core console application
This doesn’t use a dep injector. KISS (Keep It Simple S…): stackoverflow.com/a/46437144
Install NuGet package: Microsoft.Extensions.Configuration.Json
Program.cs
static void Main(string[] args)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    IConfigurationRoot configuration = builder.Build();
    foreach(var repo in configuration.GetSection("repositories").GetChildren())
    {
        string projectName = repo["projectName"];
        string repositoryId = repo["repositoryId"];
    }
}
Example appsettings.json
Ensure this files properties are set to: “Copy to Output Directory” aka <CopyToOutputDirectory>
"repositories": [
  {
    "projectName": "repo0",
    "repositoryId": "b1821e2e-94c5-4cf0-824c-41d41966207e"
  },
  {
    "projectName": "repo1",
    "repositoryId": "2f6145f9-3472-441d-bb8e-0271b4d82e28"
  },
  {
    "projectName": "repo2",
    "repositoryId": "2b029778-281f-4bb6-82fc-961dfa0f0ad0"
  }
]
See real example: Salsa/Program.cs
ASP.NET Core projects
Dep injection of config: aspnet/core/fundamentals/configuration
Startup.cs
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
    ...
    services.Configure<MyProject.Models.AppSettings>(Configuration.GetSection("MySection"));
}
Example appsettings.json
{
  "MySection": {
    "ApiUrl": "http://api.myapp.mydomain.org",
    "ApiVersion": 2
  }
}
AppSettings.cs
public class AppSettings
{
    public string ApiUrl { get; set; }
    public int ApiVersion { get; set; }
}
Controller.cs
public class MyController : Controller
{
    private readonly AppSettings _appSettings;
    public MyController(IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings.Value;
    }
    public IActionResult Index()
    {
        string apiUrl = _appSettings.ApiUrl;
        return View();
    }
}
See real example: Core/Startup.cs
Single string
If you are just accessing a few things in the Startup.cs such as adding auth you can use the following to retrieve one string:
Configuration.GetValue<string>("Authority");
{
  "Authority": "https://youridentityserver3instance.com/identity"
}
Nested single string
If you want to retrieve a nested single string you can do the following. Notice how here we are using a index style access [] instead of the GetValue or GetSection methods. This is yet another way to retrieve config strings. If you used XML Web.config in .NET Framework this will be more familiar.
Configuration["ConnectionStrings:MyDatabase"];
{
  "ConnectionStrings": {
    "MyDatabase": "Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True"
  }
}
Note worthy stuff
Use camelCase to conform to JSON standards but it seems MS cant decide if they want to stick to their old school PascalCase days.
Update: They seem to mostly give camelCase example code snippets now. Originally they had PascalCase JSON property names in the scaffolding templates.
- Call it: appsettings.json
- Untested example migration from web.config: stackoverflow.com/a/52341105 I say untested because I believe I did try this and it didn’t work however I didn’t spend much time at all testing maybe 5 mins.
Let me know what you think of this article on twitter @M3PGS or leave a comment below!