C# 无法解析设置类的依赖项注入

C# 无法解析设置类的依赖项注入,c#,asp.net-core,dependency-injection,razor-pages,C#,Asp.net Core,Dependency Injection,Razor Pages,好吧,我显然在做一些愚蠢的事情,但我似乎找不到 我正在编写我的第一个Razor Pages应用程序,并创建了一个EmailSender类,该类实现了IEmailSender。此外,EmailSender构造函数接受EmailSettings参数电子邮件设置的实现如下 appsettings.json "EmailSettings": { "Host": "****.*****.com", "Port": "587", "UserName": "****@**********.com"

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

我正在编写我的第一个Razor Pages应用程序,并创建了一个
EmailSender
类,该类实现了
IEmailSender
。此外,
EmailSender
构造函数接受
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; }
}
public void ConfigureServices(IServiceCollection services)
{

    // ...

    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
    services.AddSingleton<IEmailSender, EmailSender>();
}
Startup.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; }
}
public void ConfigureServices(IServiceCollection services)
{

    // ...

    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
    services.AddSingleton<IEmailSender, EmailSender>();
}
public void配置服务(IServiceCollection服务)
{
// ...
services.Configure(Configuration.GetSection(“EmailSettings”);
services.AddSingleton();
}
这遵循了从一个角度采取的基本方法。但当我运行应用程序时,我会立即遇到一个异常:

System.AggregateException:'无法构造某些服务(验证服务描述符“ServiceType:Microsoft.AspNetCore.Identity.UI.Services.IEmailSender生存期:瞬态实现类型:Bamtok.Services.EmailSender”时出错:在尝试激活“Bamtok.Services.EmailSender”时无法解析类型“Bamtok.Services.EmailSettings”的服务。)

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

有人能看到我遗漏了什么吗?

Configure
寄存器
IOptions
并且,正如您所述,您将
电子邮件设置
注入到依赖类中

您可以让类保持原样,重构
Startup

public void ConfigureServices(IServiceCollection services) {

    // ...

    EmailSettings settings = Configuration.GetSection("EmailSettings").Get<EmailSettings>();
    services.AddSingleton(settings);
    services.AddSingleton<IEmailSender, EmailSender>();
}
public void配置服务(IServiceCollection服务){
// ...
EmailSettings=Configuration.GetSection(“EmailSettings”).Get();
services.AddSingleton(设置);
services.AddSingleton();
}
更新类以期望
IOptions
依赖项

public class EmailSender : IEmailSender {
    private readonly EmailSettings emailSettings;

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

    //...
}
公共类EmailSender:IEmailSender{
私人只读电子邮件设置电子邮件设置;
公共电子邮件发件人(IOptions电子邮件设置){
this.emailSettings=emailSettings.Value;
}
//...
}

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

Configure添加了
IOptions
,很可能您将
EmailSettings
注入了依赖类。链接文章显示了正在注入的
IOptions-EmailSettings