簡體   English   中英

使用IOption的類的實例化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM