【问题标题】:Dependency injection for settings class cannot be resolved无法解决设置类的依赖注入
【发布时间】:2019-11-30 18:56:42
【问题描述】:

好的,我显然在这里做了一些愚蠢的事情,但我似乎找不到它。

我正在编写我的第一个 Razor Pages 应用程序并创建了一个 EmailSender 类,它实现了 IEmailSender。此外,EmailSender 构造函数接受 EmailSettings 参数。 EmailSettings 实现如下。

appsettings.json

"EmailSettings": {
  "Host": "****.*****.com",
  "Port": "587",
  "UserName": "****@**********.com",
  "Password": "***********",
  "FromAddress": "****@**********.com",
  "EnableSsl": "true"
},

EmailSettings.cs

public class EmailSettings
{
    public string Host { get; set; }
    public int Port { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string FromAddress { get; set; }
    public bool EnableSsl { get; set; }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{

    // ...

    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
    services.AddSingleton<IEmailSender, EmailSender>();
}

这遵循article I read 的基本方法。但是当我运行该应用程序时,我立即得到一个异常:

System.AggregateException: '某些服务无法构建(验证服务描述符时出错'ServiceType: Microsoft.AspNetCore.Identity.UI.Services.IEmailSender Lifetime: Transient ImplementationType: Bamtok.Services.EmailSender': Unable在尝试激活“Bamtok.Services.EmailSender”时解析“Bamtok.Services.EmailSettings”类型的服务。)”

不知何故,它无法实例化 EmailSettings 实例以传递给 EmailSender 构造函数。

谁能看到我错过了什么?

【问题讨论】:

  • Configure 添加了IOptions&lt;EmailSettings&gt; 并且很可能您将EmailSettings 注入到依赖类中。
  • 链接文章显示IOptions&lt;EmailSettings&gt; emailSettings被注入

标签: c# asp.net-core dependency-injection razor-pages


【解决方案1】:

Configure&lt;T&gt; 注册 IOptions&lt;EmailSettings&gt; 并且,正如您所说,您将 EmailSettings 注入到依赖类中。

您可以保留课程并重构 Startup

public void ConfigureServices(IServiceCollection services) {

    // ...

    EmailSettings settings = Configuration.GetSection("EmailSettings").Get<EmailSettings>();
    services.AddSingleton(settings);
    services.AddSingleton<IEmailSender, EmailSender>();
}

或者更新类以期望 IOptions&lt;T&gt; 依赖项

public class EmailSender : IEmailSender {
    private readonly EmailSettings emailSettings;

    public EmailSender(IOptions<EmailSettings> emailSettings) {
        this.emailSettings = emailSettings.Value;
    }

    //...
}

前者与后者建议的区别在于实现不会与框架问题耦合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2019-11-25
    • 1970-01-01
    • 2019-03-07
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多