Configuration.bind未设置值
我在appsettings中有如下这段配置:
"ExternalApiSettings": [
{
"User": "Administrator",
"Key": "From user secrets",
"Roles": [
"Admin"
],
"Controllers": [
"All"
]
}
],
我想把它绑定到下列类的Users属性:
public static class ExternalApiSettings
{
public static IEnumerable<ExternalApiUser> Users { get; set; } = Array.Empty<ExternalApiUser>();
}
通过以下内容
builder.Configuration.GetSection("ExternalApiSettings").Bind(ExternalApiSettings.Users);
但是在访问 ExternalApiSettings.Users 时,总是得到一个空数组。
如果我执行下面的
ExternalApiSettings.Users = configuration.GetSection(nameof(ExternalApiSettings)).Get<IEnumerable<ExternalApiUser>>();
Users会被填充,那么绑定不工作是否有原因?
另外,我代码中的其他绑定都能正常工作——例如
builder.Configuration.GetSection("Umbraco:CMS:Content:Error404Collection").Bind(SiteSettings.ErrorPageCollection);
"Umbraco": {
"CMS": {
"Content": {
"AllowEditInvariantFromNonDefault": true,
"Error404Collection": [
{
"Culture": "default",
"ContentKey": "aff1fbee-5a34-4c89-a7b2-4bcdbf4a6529"
}
],
}
}
}
public static class SiteSettings
{
public static IEnumerable<ErrorPageSettings> ErrorPageCollection { get; set; } = Array.Empty<ErrorPageSettings>();
}
解决方案
你的问题在于你正在调用扩展方法 ConfigurationBinder.Bind() 的某个重载:
void Bind(this IConfiguration configuration, object? instance);尝试将给定的对象实例绑定到配置值,方法是递归地将属性名与配置键进行匹配。
该扩展方法的所有重载都需要接收一个 object? instance —— 但你实际传入的对象是一个空的不可变集合,具体来说是 Array.Empty<ExternalApiUser>()。由于数组不能添加元素,因此绑定会失败。
并且,与 public static T? ConfigurationBinder.Get<T>(this IConfiguration configuration) 不同,API没有办法返回一个新列表来替换现有数组。
相反,请使用一个可变集合,例如 List<T>:
public static class ExternalApiSettings
{
public static IEnumerable<ExternalApiUser> Users { get; set; } = new List<ExternalApiUser>();
}
public static class SiteSettings
{
public static IEnumerable<ErrorPageSettings> ErrorPageCollection { get; set; } = new List<ErrorPageSettings>();
}
演示fiddle #1在此 这里.
注:在你的问题中你说对 public static IEnumerable ErrorPageCollection { get; set; } = Array.Empty(); 的绑定工作正常,但我测试时也失败,参见演示fiddle #2 这里。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。