c# - 无法解析设置类的依赖注入(inject)

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

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

我正在编写我的第一个 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: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.UI.Services.IEmailSender Lifetime: Transient ImplementationType: Bamtok.Services.EmailSender': Unable to resolve service for type 'Bamtok.Services.EmailSettings' while attempting to activate 'Bamtok.Services.EmailSender'.)'

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

谁能看到我错过了什么?

最佳答案

Configure<T>寄存器 IOptions<EmailSettings>并且,正如您所说,您注入(inject)了 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;
    }

    //...
}

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

关于c# - 无法解析设置类的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59119241/

相关文章:

spring - JBoss 6 + Spring 3.0.5 + JAX-WS/CXF

java - 有没有办法使用 HK2 将实例注入(inject)集合中?

asp.net-core - ASP.NET Core 现在是否支持 SQL Server CE?

c# - 使用图形 API 将成员添加到 azure Active Directory 中的组会出现 URl 无效错误

java - 使用覆盖模块扩展 ObjectGraph

c# - 具有自定义 WCF 4.5 WebHttpBehavior 的 UriTemplates

c# - 有没有办法在 Razor 页面的 CSHTML 中的条件内使用 [Authorize] 属性?

javascript - 如何更改日历在文本框上的可见性单击

c# - 关联文件类型和图标

c# - 在 C# 中禁用键盘/鼠标