首页 > 解决方案 > 无法解决设置类的依赖注入

问题描述

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

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

应用设置.json

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

电子邮件设置.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; }
}

启动.cs

public void ConfigureServices(IServiceCollection services)
{

    // ...

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

这遵循从我阅读的一篇文章中获取的基本方法。但是当我运行该应用程序时,我立即得到一个异常:

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

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

谁能看到我错过了什么?

标签: c#asp.net-coredependency-injectionrazor-pages

解决方案


Configure<T>注册IOptions<EmailSettings>,并且正如您所说,您注入EmailSettings了依赖类。

您可以按原样保留课程并重构Startup

public void ConfigureServices(IServiceCollection services) {

    // ...

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

或者更新类以期望IOptions<T>依赖

public class EmailSender : IEmailSender {
    private readonly EmailSettings emailSettings;

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

    //...
}

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


推荐阅读