gpt4 book ai didi

c# - ASP.NET Core 中 AppSettings.json 内的 POCO 对象数组

转载 作者:行者123 更新时间:2023-12-02 01:43:30 26 4
gpt4 key购买 nike

这看起来应该很简单,我一直在搜索SO和很多其他地方来寻找这个问题的答案,我发现和尝试的一切都不起作用。

我有一个如下所示的 appsettings.json 文件

"Email": {
"Port": "25",
"Host": "localhost",
"EnableSSL": "false",
"Credentials": {
"Username": "fakeuser",
"Password": "fakepassword"
},
"SystemFromAddress": "testsender@localhost.com",
"SystemFromDisplayName": "Test Sender",
"EmailTemplateRootDirectory": "Email\\EmailTemplates",
"EmailTemplates": [
{
"TemplateKey": "ResetPassword",
"TemplatePath": "ResetPassword.cshtml"
},
{
"TemplateKey": "NewAccount",
"TemplatePath": "NewAccount.cshtml"
},
{
"TemplateKey": "VerifyEmail",
"TemplatePath": "VerifyEmail.cshtml"
}
]

}

我尝试绑定(bind)到多个模型(EmailOptions 是父级),EmailOptions 类期望从 appsettings.json 中的 EmailTemplates 列表填充其 EmailTemplates 列表,如上所示。

父类正在按预期由 appsettings.json 文件填充,此类中的电子邮件模板子列表始终为空。

这是我要绑定(bind)的类。

public class EmailOptions
{
public int Port { get; set; }
public string Host { get; set; }
public bool EnableSSL { get; set; }
public EmailCredentials Credentials { get; set; }
public string SystemFromAddress { get; set; }
public string SystemFromDisplayName { get; set; }
public string EmailTemplateRootDirectory { get; set; }

public IEnumerable<EmailTemplate> EmailTemplates { get; set; } = new List<EmailTemplate>();

}

public class EmailTemplate
{
public string TemplateKey { get; set; }
public string TemplatePath { get; set; }
}

public class EmailCredentials
{
public string Username { get; set; }
public string Password { get; set; }
}

我正在 ASP.NET Core 的启动类中使用以下调用。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

services.AddOptions();
services.Configure<EmailOptions>( _configuration.GetSection("Email" ));
...

由于某种原因,我的 EmailOptions 中的 IEnumerable 属性没有从 appsettings.json 反序列化到我的选项中 - 当我尝试在 Controller 中的任何位置使用它时 - 该列表始终设置为空数组。

FWIW:我在控制台应用程序中使用此功能,我可以更好地控制从 appsettings.json 设置选项。这是我在控制台应用程序中所做的事情(为了简洁起见,我省略了使用 DI 容器设置选项的代码)

var emailSection = configuration.GetSection( "Email" );
var emailOptions = emailSection.Get<EmailOptions>();

emailOptions.EmailTemplates = configuration.GetSection( "Email:EmailTemplates" ).Get<List<EmailTemplate>>();

正如预期的那样 - 在控制台应用程序中,我获得了电子邮件模板,因为我能够单独获取子列表并将其添加到选项中,然后再将其移交给 DI 容器。我在 ASP.NET Core IServiceCollection.Configure() 扩展方法中似乎没有这种灵 active (所以也许使用另一种方法来执行此操作?哪个?经过几个小时的搜索,我哭了叔叔并寻求帮助) .

那么如何使用 ASP.NET Core“IServiceCollection.Configure()”方法使其工作呢?有更好的方法吗?

最佳答案

感谢乔指出需要发生什么!

我做出了错误的假设,即序列化器很乐意从 json 创建它的列表,并将该列表分配给我的 IEnumerable - 相反 - 如果您打算将 json 对象列表反序列化到您的选项中,您需要确保使用 List (以及其他适用的具体 dotnet 类型)。

所以而不是这个

IEnumerable<EmailTemplate> EmailTemplates { get; set; }    

我应该有这个...

List<EmailTemplate> EmailTemplates { get; set; }

关于c# - ASP.NET Core 中 AppSettings.json 内的 POCO 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com