Reputation: 5162
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.
Upvotes: 43
Views: 135905
Reputation: 4504
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)
Upvotes: 40
Reputation: 1447
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...
Upvotes: 45
Reputation: 1671
It works for me on .Net Core directly on Razor HTML:
@Html.Raw(Configuration.GetSection("ConnectionStrings")["DefaultConnectoin"]) <!-- 2 levels -->
@Html.Raw(Configuration.GetSection("Logging")["LogLevel:Default"]) <!-- 3 levels -->
@Html.Raw(Configuration.GetSection("SmsSettings")["EndMessagePart"]) <!-- 2 levels -->
Upvotes: 3
Reputation: 2152
If you use GetSections()
along with Bind()
you should be able to create poco objects for your use.
var poco= new PocoClass();
Configuration.GetSection("SmsSettings").Bind(poco);
This should return to you a poco object with all the values set.
Upvotes: 27
Reputation: 167
If you required any section with "GetSection" and (key,value), try this:
Configuration.GetSection("sectionName").GetChildren().ToList()
and get a Collection of keys with vallues, can manipulate with LinQ
Upvotes: 2
Reputation: 375
If you use the Bind method on the object returned by GetSection, then this would bind the key value pairs within the section to corresponding properties of the object it has been bound too.
For example,
class ConnectionStrings {
public string DefaultConnection { get; set;}
public string ProductionConnection {get; set;}
}
..
var connectionStrings = new ConnectionStrings();
var section = Configuration.GetSection("ConnectionStrings").Bind(connectionStrings);
Upvotes: 6