Configuration.GetSection 在 Asp.Net Core 2.0 获取所有设置
Configuration.GetSection in Asp.Net Core 2.0 getting all settings
我正在尝试学习检索配置信息的各种方法,以便确定为即将进行的项目设置和使用配置的最佳途径。
我可以使用
访问各种单一设置
var sm = new SmsSettings
{
FromPhone = Configuration.GetValue<string>("SmsSettings:FromPhone"),
StartMessagePart = Configuration.GetValue<string>("SmsSettings:StartMessagePart"),
EndMessagePart = Configuration.GetValue<string>("SmsSettings:EndMessagePart")
};
我还需要能够对设置进行计数,确定某些设置的值等。所以我正在构建一个解析方法来执行这些类型的操作,并且需要设置文件的整个部分,这是我假设的GetSection 做到了。
错了。
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."
}
}
此代码:
var section = Configuration.GetSection("ConnectionStrings");
Returns 这些结果:
出现了几个问题。
- 为什么这会返回 3 个不同的 JsonConfigurationProvider,其中一个包含 appsettings.json 文件中的每个设置(如图 2 所示)
- 为什么 GetSection("ConnectionStrings") 实际上不这样做,返回 ConnectionStrings 的子子项
- 给定数字 2,您实际上如何检索 ConnectionStrings 的子项?
- 假设一个模型ConnectionStrings,有一个属性,List Connections,section可以转换成对象吗?
如果您对 GetSection 返回的对象使用 Bind 方法,那么这会将部分中的键值对绑定到它所绑定的对象的相应属性。
例如,
class ConnectionStrings {
public string DefaultConnection { get; set;}
public string ProductionConnection {get; set;}
}
..
var connectionStrings = new ConnectionStrings();
var section = Configuration.GetSection("ConnectionStrings").Bind(connectionStrings);
根据这个post
https://github.com/aspnet/Configuration/issues/716
-
GetSection("Name").Value
将 return 为 null,您必须使用 GetChildren
获取子项
Bind
将填充 provided object
的属性,默认情况下它映射到 public
属性,查看支持 private
属性的更新。
- 尝试
Get<T>()
over bind,它将为您提供配置对象的强类型实例
尝试你的 class 的简单 POCO(没有复杂的 getter/setters,所有 public,没有方法)然后从那里开始
更新:
从 .net core 2.1 BindNonPublicProperties 添加到 BinderOptions
,因此如果设置为 true(默认为 false),活页夹将尝试设置所有非只读属性。
var yourPoco = new PocoClass();
Configuration.GetSection("SectionName").Bind(yourPoco, c => c.BindNonPublicProperties = true)
如果您将 GetSections()
与 Bind()
一起使用,您应该能够创建 poco 对象供您使用。
var poco= new PocoClass();
Configuration.GetSection("SmsSettings").Bind(poco);
这应该return给你一个设置了所有值的 poco 对象。
如果您需要任何包含 "GetSection" 和(键,值)的部分,请尝试以下操作:
Configuration.GetSection("sectionName").GetChildren().ToList()
并得到一组有值的键,可以用 LinQ 操作
我直接在 Razor 的 .Net Core 上工作 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 -->
我知道答案已被接受。但是,提供适当的示例代码,以防万一有人想了解更多...
绑定自定义强类型配置非常简单。 IE。配置 json 如下所示
{
"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": ""
}
}
}
}
你的 C# 类 看起来像
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; }
}
您可以通过 GetSection("sectionNameWithPath")
获取该部分,然后通过调用 Get<T>()
;
转换为强类型
var smsSettings = Configuration.GetSection("AppSettings:SmsSettings").Get<SmsSettings>();
var auth2Keys= Configuration.GetSection("AppSettings:Auth2Keys").Get<Auth2Keys>();
对于简单的字符串值
var isDebugMode = Configuration.GetValue("AppSettings:IsDebugMode");
希望这对您有所帮助...
我正在尝试学习检索配置信息的各种方法,以便确定为即将进行的项目设置和使用配置的最佳途径。
我可以使用
访问各种单一设置var sm = new SmsSettings
{
FromPhone = Configuration.GetValue<string>("SmsSettings:FromPhone"),
StartMessagePart = Configuration.GetValue<string>("SmsSettings:StartMessagePart"),
EndMessagePart = Configuration.GetValue<string>("SmsSettings:EndMessagePart")
};
我还需要能够对设置进行计数,确定某些设置的值等。所以我正在构建一个解析方法来执行这些类型的操作,并且需要设置文件的整个部分,这是我假设的GetSection 做到了。 错了。
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."
}
}
此代码:
var section = Configuration.GetSection("ConnectionStrings");
Returns 这些结果:
出现了几个问题。
- 为什么这会返回 3 个不同的 JsonConfigurationProvider,其中一个包含 appsettings.json 文件中的每个设置(如图 2 所示)
- 为什么 GetSection("ConnectionStrings") 实际上不这样做,返回 ConnectionStrings 的子子项
- 给定数字 2,您实际上如何检索 ConnectionStrings 的子项?
- 假设一个模型ConnectionStrings,有一个属性,List Connections,section可以转换成对象吗?
如果您对 GetSection 返回的对象使用 Bind 方法,那么这会将部分中的键值对绑定到它所绑定的对象的相应属性。
例如,
class ConnectionStrings {
public string DefaultConnection { get; set;}
public string ProductionConnection {get; set;}
}
..
var connectionStrings = new ConnectionStrings();
var section = Configuration.GetSection("ConnectionStrings").Bind(connectionStrings);
根据这个post
https://github.com/aspnet/Configuration/issues/716
-
GetSection("Name").Value
将 return 为 null,您必须使用GetChildren
获取子项 Bind
将填充provided object
的属性,默认情况下它映射到public
属性,查看支持private
属性的更新。- 尝试
Get<T>()
over bind,它将为您提供配置对象的强类型实例
尝试你的 class 的简单 POCO(没有复杂的 getter/setters,所有 public,没有方法)然后从那里开始
更新:
从 .net core 2.1 BindNonPublicProperties 添加到 BinderOptions
,因此如果设置为 true(默认为 false),活页夹将尝试设置所有非只读属性。
var yourPoco = new PocoClass();
Configuration.GetSection("SectionName").Bind(yourPoco, c => c.BindNonPublicProperties = true)
如果您将 GetSections()
与 Bind()
一起使用,您应该能够创建 poco 对象供您使用。
var poco= new PocoClass();
Configuration.GetSection("SmsSettings").Bind(poco);
这应该return给你一个设置了所有值的 poco 对象。
如果您需要任何包含 "GetSection" 和(键,值)的部分,请尝试以下操作:
Configuration.GetSection("sectionName").GetChildren().ToList()
并得到一组有值的键,可以用 LinQ 操作
我直接在 Razor 的 .Net Core 上工作 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 -->
我知道答案已被接受。但是,提供适当的示例代码,以防万一有人想了解更多...
绑定自定义强类型配置非常简单。 IE。配置 json 如下所示
{
"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": ""
}
}
}
}
你的 C# 类 看起来像
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; }
}
您可以通过 GetSection("sectionNameWithPath")
获取该部分,然后通过调用 Get<T>()
;
var smsSettings = Configuration.GetSection("AppSettings:SmsSettings").Get<SmsSettings>();
var auth2Keys= Configuration.GetSection("AppSettings:Auth2Keys").Get<Auth2Keys>();
对于简单的字符串值
var isDebugMode = Configuration.GetValue("AppSettings:IsDebugMode");
希望这对您有所帮助...