【发布时间】:2018-08-23 19:03:53
【问题描述】:
我正在尝试使用SendGrid 通过我的ASP.NET Core 应用程序发送电子邮件,因此我按以下方式对其进行了配置:
在ConfigureServices 方法中,我添加了一个Singleton 和一个访问SendGrid API 的配置:
services.AddSingleton<IEmailSender, IEmailSender>();
services.Configure<AuthMessageSenderOptions>(Configuration);
AuthMessageSenderOptions 类是软件配置的一部分:
public class AuthMessageSenderOptions
{
public string SendGridUser { get; set; }
public string SendGridKey { get; set; }
}
这个类管理SendGrid 用户名和密钥。
我创建了一个service 类,实现了IEmailSender 接口,这是实现:
public class EmailSender : IEmailSender
{
public AuthMessageSenderOptions Options { get; }
public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
public Task SendEmailAsync(string email, string subject, string message)
{
return Execute(Options.SendGridKey, subject, message, email);
}
public Task Execute(string apiKey, string subject, string message, string email)
{
var client = new SendGridClient(apiKey);
var msg = new SendGridMessage()
{
From = new EmailAddress("foo@gmail.com", "Foo"),
Subject = subject,
PlainTextContent = message,
HtmlContent = message
};
msg.AddTo(new EmailAddress(email));
msg.TrackingSettings = new TrackingSettings
{
ClickTracking = new ClickTracking { Enable = false }
};
return client.SendEmailAsync(msg);
}
}
然后在我的Account 控制器(用于执行注册和登录)中,我将IEmailSender 服务注入到构造函数中:
public class AccountController : Controller
{
private readonly IEmailSender _emailSender;
public AccountController(IEmailSender emailSender)
{
_emailSender = emailSender;
}
当我启动应用程序时出现此错误:
System.ArgumentException: '无法为服务类型'Microsoft.AspNetCore.Identity.UI.Services.IEmailSender'实例化实现类型'Microsoft.AspNetCore.Identity.UI.Services.IEmailSender'。'
在Program 类中,特别是在这一行:
CreateWebHostBuilder(args).Build().Run();
这是完整的Program 类:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
我做错了什么?
我正在学习 ASP.NET Core 所以,如果我做了一些愚蠢的事情,对不起,我按照 this doc 来实现 SendGrid 逻辑。
【问题讨论】:
标签: c# asp.net asp.net-core sendgrid