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

问题描述 投票:1回答:1

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

我正在编写我的第一个Razor Pages应用,并创建了一个实现EmailSenderIEmailSender类。另外,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生存期:临时实现类型:Bamtok.Services.EmailSender时出错”:无法尝试激活“ Bamtok.Services.EmailSender”时,将服务解析为“ Bamtok.Services.EmailSettings”。)]

以某种方式,它无法实例化EmailSettings实例以传递给EmailSender构造函数。

谁能看到我想念的东西吗?

c# asp.net-core dependency-injection razor-pages
1个回答
1
投票

[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;
    }

    //...
}

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

© www.soinside.com 2019 - 2024. All rights reserved.