I am trying to learn the various ways to retrieve configuration info so I can determine the best path for setting up and using configuration for an upcoming project.
I can access the various single settings using
var sm = new SmsSettings { FromPhone = Configuration.GetValue<string>("SmsSettings:FromPhone"), StartMessagePart = Configuration.GetValue<string>("SmsSettings:StartMessagePart"), EndMessagePart = Configuration.GetValue<string>("SmsSettings:EndMessagePart") };
I also need to be able to count settings, determine values of certain settings etc. So I was building a parsing method to do these types of things and needed a whole section of the settings file, which is what I assumed GetSection did. Wrong.
appsettings.json :
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TestingConfigurationNetCoreTwo;Trusted_Connection=True;MultipleActiveResultSets=true", "ProductionConnection": "Server=(localdb)\\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Production;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } }, "SmsSettings": { "FromPhone": "9145670987", "StartMessagePart": "Dear user, You have requested info from us on starting", "EndMessagePart": "Thank you." } }
This code:
var section = Configuration.GetSection("ConnectionStrings");
Returns these results:
A few questions arise.
according to this post
https://github.com/aspnet/Configuration/issues/716
GetSection("Name").Value
will return null, you must use GetChildren
to get the child itemsBind
will populate the properties aginst the provided object
, by default it maps against public
properties, look at the update to support private
properties.Get<T>()
over bind, it will provide you a strongly typed instance of the configuration objecttry a simple POCO of your class (no complex getter/setters, all public, no methods) and then take it from there
Update:
From .net core 2.1 BindNonPublicProperties added to BinderOptions
, so if set to true (default is false) the binder will attempt to set all non read-only properties.
var yourPoco = new PocoClass(); Configuration.GetSection("SectionName").Bind(yourPoco, c => c.BindNonPublicProperties = true)
I understand the answer has been accepted. However, providing proper example code, just in case anyone looking to understand a bit more...
It is quite straight forward to bind custom strong type configuration. ie. configuration json looks like below
{ "AppSettings": { "v": true, "SmsSettings": { "FromPhone": "9145670987", "StartMessagePart": "Dear user, You have requested info from us on starting", "EndMessagePart": "Thank you." }, "Auth2Keys": { "Google": { "ClientId": "", "ClientSecret": "" }, "Microsoft": { "ClientId": "", "ClientSecret": "" }, "JWT": { "SecretKey": "", "Issuer": "" } } } }
and your C# classes looks like
public class SmsSettings{ public string FromPhone { get; set;} public string StartMessagePart { get; set;} public string EndMessagePart { get; set;} } public class ClientSecretKeys { public string ClientId { get; set; } public string ClientSecret { get; set; } } public class JWTKeys { public string SecretKey { get; set; } public string Issuer { get; set; } } public class Auth2Keys { public ClientSecretKeys Google { get; set; } public ClientSecretKeys Microsoft { get; set; } public JWTKeys JWT { get; set; } }
You can get the section by GetSection("sectionNameWithPath")
and then Convert to strong type by calling Get<T>()
;
var smsSettings = Configuration.GetSection("AppSettings:SmsSettings").Get<SmsSettings>(); var auth2Keys= Configuration.GetSection("AppSettings:Auth2Keys").Get<Auth2Keys>();
For simple string values
var isDebugMode = Configuration.GetValue("AppSettings:IsDebugMode");
Hope this helps...
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