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

时间:2017-09-10 23:25:46

标签: c# asp.net-core asp.net-core-mvc .net-core asp.net-core-2.0

我的问题是Configure.Services<model>()没有将我的用户机密绑定到我的班级。我服务中注入的类总是具有null属性。

我的秘密.json看起来像这样:

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

我创建了这个用户设置类:

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()我正在注册课程:

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" />

没有用。

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

尝试不使用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/