Asp.net 核心 2.0 Configure.Services<model>() 绑定不适用于用户机密

Asp.net core 2.0 Configure.Services<model>() binding isn't working with user secrets

我的问题是 Configure.Services<model>() 没有将我的用户机密绑定到我的 class。我的服务中注入的 class 始终具有空属性。

我的 secrets.json 看起来像这样:

{
  "OtherSection": {
    "Another": {
      "Prop": "1234"
    }
  },
  "EmailSettings": {
    "Mailgun": {
      "ApiKey": "omitted",
      "BaseUri": "omitted",
      "RequestUri": "omitted",
      "From": "omitted",
      "Smtp": "omitted",
      "SmtpUser": "omitted",
      "SmtpPass": "omitted",
      "SmtpPort": 465
    }
  }
}

我已经创建了这个用户设置class:

public class MailgunSettings : ISmtpDetails
{
    public string ApiKey { get; set; }
    public string BaseUri { get; set; }
    public string RequestUri { get; set; }
    public string From { get; set; }
    public string Smtp { get; set; }
    public string SmtpUser { get; set; }
    public string SmtpPass { get; set; }
    public int SmtpPort { get; set; }
}

在我的 Startup.cs ConfigureServices() 中,我正在注册 class 像这样:

services.Configure<MailgunSettings>(options => Configuration.GetSection("EmailSettings:Mailgun").Bind(options));

然后我将它注入到我的 EmailSender 服务中,如下所示:

private readonly ISmtpDetails _smtpSettings;

public EmailSender(IOptions<MailgunSettings> smtpSettings)
{
    this._smtpSettings = smtpSettings.Value;
}

smtpSettings.Value 的每个 属性 都是空的。

我可以通过以下方式访问 Startup.cs 中的配置设置:

Configuration["EmailSettings:Mailgun:ApiKey"];

我尝试安装以下 nuget 包:

<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.0" />

没用。

我真的不明白为什么它没有绑定并且没有生成任何错误消息。

有人能帮忙吗?

尝试不使用 ISmtpDetails 接口:

public class MailgunSettings
{
    public string ApiKey { get; set; }
    public string BaseUri { get; set; }
    public string RequestUri { get; set; }
    public string From { get; set; }
    public string Smtp { get; set; }
    public string SmtpUser { get; set; }
    public string SmtpPass { get; set; }
    public int SmtpPort { get; set; }
}

private readonly MailgunSettings _smtpSettings;

public EmailSender(IOptions<MailgunSettings> smtpSettings)
{
    this._smtpSettings = smtpSettings.Value;
}

如果有效,您需要配置 services.Configure<ISmtpDetails> 并注入 IOptions<ISmtpDetails>

我建议您只使用 MailgunSettings 并摆脱 Interface ISmtpDetails,不需要接口,因为 .NET Core 已经为您提供了 IOptions<T> Interface

这里有一篇文章可以检查您的 IOptions 模式:https://andrewlock.net/how-to-use-the-ioptions-pattern-for-configuration-in-asp-net-core-rc2/