好吧,我显然在这里做一些愚蠢的事情,但是我似乎找不到它。
我正在编写我的第一个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生存期:临时实现类型:Bamtok.Services.EmailSender时出错”:无法尝试激活“ Bamtok.Services.EmailSender”时,将服务解析为“ Bamtok.Services.EmailSettings”。)]
以某种方式,它无法实例化EmailSettings
实例以传递给EmailSender
构造函数。
谁能看到我想念的东西吗?
[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;
}
//...
}
前者与后者的建议之间的区别在于,实施不会与框架问题耦合。