[英]Instantiation of a class that uses IOption
在ASP.NET Core 2.1中,我有一個使用IOptions接口發送電子郵件的類,如下所示:
public class Email
{
private readonly ManuelaIbiEmail manuelaIbiEmail;
public Email(IOptions<ManuelaIbiEmail> manuelaIbiEmail)
{
this.manuelaIbiEmail.Username = manuelaIbiEmail.Value.Username;
this.manuelaIbiEmail.Password = manuelaIbiEmail.Value.Password;
}
public async Task SendAsync(Contato contato)
{
var smtpClient = new SmtpClient
{
Host = "smtp.sendgrid.net",
Port = 587,
EnableSsl = true,
Credentials = new NetworkCredential(manuelaIbiEmail.Username, manuelaIbiEmail.Password)
};
using (var message = new MailMessage(contato.Email, "manuelaibi66@gmail.com")
{
Subject = "Email de Manuela Ibi Nutrição Integrada",
Body = $"{contato.Comentario}\nTelefone: {contato.Telefone}"
})
{
await smtpClient.SendMailAsync(message);
}
}
}
此類必須在控制器中使用“ var what = new Email(???);”這樣的行實例化。 為了可以調用SendAsync方法。
但是,這里的大局是我在初始化中迷路了。 我只是不知道在“ Email( something )”中該叫什么 。
只是,需要提供一些更多信息,以防萬一:
系統應該從Secrets中讀取用戶名和密碼,因此Startup.cs中包含以下行:
services.Configure<ManuelaIbiEmail>(Configuration.GetSection("ManuelaIbiEmail"));
ManuelaIbiEmail是一個非常簡單的POCO類:
public class ManuelaIbiEmail
{
public string Username { get; set; }
public string Password { get; set; }
}
控制器看起來像:
public class ContactController : Controller
{
private readonly ManuelaIbiEmail manuelaIbiEmail;
public IActionResult Contact()
{
return View(new Contato());
}
[HttpPost]
public async Task<IActionResult> ContactAsync(Contato contato)
{
var email = new Email();
email.SendAsync(contato);
return Ok();
}
}
如果有人能告訴我我所缺少的東西,我將不勝感激。
先感謝您
依賴項注入的全部目的是不這樣做 。
您可以通過屬性在方法中注入它:
public class ContactController : Controller
{
public IActionResult Contact()
{
return View(new Contato());
}
[HttpPost]
public async Task<IActionResult> ContactAsync(Contato contato, [FromServices]Email email)
{
email.SendAsync(contato);
return Ok();
}
}
或通過構造函數注入:
public class ContactController : Controller
{
private readonly EMail email;
public ContactController(Email email)
{
this.email = email;
}
public IActionResult Contact()
{
return View(new Contato());
}
[HttpPost]
public async Task<IActionResult> ContactAsync(Contato contato)
{
email.SendAsync(contato);
return Ok();
}
}
理想情況下,您不希望通過手動初始化Email
來使控制器與實現問題緊密聯系,因為類應該依賴於抽象而不是具體 。
抽象電子郵件類
public interface IEmail {
Task SendAsync(Contato contato);
}
public class Email: IEmail {
//...omitted for brevity
}
您可以通過構造函數注入將其注入控制器
public class ContactController : Controller {
private readonly IEmail email;
public ContactController(IEmail email) {
this.email = email;
}
public IActionResult Contact() {
return View(new Contato());
}
[HttpPost]
public async Task<IActionResult> ContactAsync(Contato contato) {
await email.SendAsync(contato);
return Ok();
}
}
一旦正確配置
services.AddTransient<IEmail, Email>();
容器將在創建要注入的對象圖時解析所有依賴項。
只需通過構造函數注入Email
:
public class ContactController : Controller
{
public ContactController(Email email)
{
Email = email;
}
public Email Email { get; }
public IActionResult Contact()
{
return View(new Contato());
}
[HttpPost]
public async Task<IActionResult> ContactAsync(Contato contato)
{
Email.SendAsync(contato);
return Ok();
}
}
我的主張:
創建一個IOption
實例並使用該實例初始化您的類Email
using Microsoft.Extensions.Options;
var mail = new ManuelaIbiEmail() { Username= "", Password="" };
IOptions<ManuelaIbiEmail> options = Options.Create(mail);
var email = new Email(options);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.