I was following some examples for ASP.NET 5 and I got stumbled with how to properly read "nested" configuration values (if that is the proper term).
Here is relevant portion of config.json
:
{
"ApplicationName" : "OwNextApp",
"AppSettings": {
"SiteTitle": "OwNext"
},
}
And relevant portion of HomeController.cs
:
public IActionResult About()
{
var appNestedNameFailed = _config.Get("AppSettings.SiteTitle");
var appNestedNameSuccess = _config.Get("AppSettings:SiteTitle");
var appName = _config.Get("ApplicationName");
ViewBag.Message = string.Format(@"Your
APP NAME: {0};
APP NESTED NAME FAILED: {1};
APP NESTED NAME SUCCESS: {2}",
appName, appNestedNameFailed, appNestedNameSuccess);
return View();
}
Value for appNestedNameFailed
is empty (my initial try before research). And appNestedNameSuccess
has value; after I did research and found in tests for Configuration (relevant code shown):
// Assert
Assert.Equal("IniValue1", config.Get("IniKey1"));
Assert.Equal("IniValue2", config.Get("IniKey2:IniKey3"));
Can someone explain why is this the case? Why would it make sense to use :
over .
? From my interaction with JSON data usually .
notation works fine, e.g. How to access nested json data.
Also, I found similar SO question but this does not give explanation of why :
was chosen.
To read configuration values in ASP.NET Core, you need to follow the Options pattern. To implement it, define a configuration class matching the values you want to read from the appsetttings. json file and use the default dependency container to inject the read values.
Asp.net Core uses Project. JSON file for storing all project level configuration settings. The Project. json file stores configuration information in JSON format.
Using IConfiguration The IConfiguration is available in the dependency injection (DI) container, so you can directly access JSON properties by simply injecting IConfiguration in the constructor of a controller or class. It represents a set of key/value application configuration properties.
You could add the IConfiguration instance to the service collection as a singleton object in ConfigureServices : public void ConfigureServices(IServiceCollection service) { services. AddSingleton<IConfiguration>(Configuration); //... }
That's the convention that we decided upon when we first created the configuration model. We started with json in mind and :
is the delimiter there.
Anyways, if you don't want to worry about those conventions, I recommend using the ConfigurationBinder which binds a configuration to a model (a strong type object). Here are the tests on GitHub that can serve as example.
using Microsoft.Extensions.Configuration;
using System.IO;
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetValue<string>("ConnectionStrings:DefaultConnection");
// or
var connectionString2= configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "myconnection"
},
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With