1

问题:
我有一个简单的范围电子邮件发件人服务。该服务依赖于在构造函数中注入的配置。
如果配置文件中缺少预期的部分,电子邮件服务会在构造函数中引发异常。

如果不在构造函数的服务中放置 IsConfigured 标志并重构一堆代码,我无法找到处理此异常的方法。

原始代码

...
// startup.cs
public void ConfigureServices(IServiceCollection services)
{
   //
   //
   // EmailService configured as a Scoped service
   services.AddScoped<IEmailService, EmailService>();
}

// service implementation
public class EmailService : IEmailService
{
    private readonly IConfiguration _config;
    private readonly ILogger<EmailService> _logger;

    public EmailService(IConfiguration config, ILogger<EmailService> logger)
    {
        smtpHost = config["Email:SmtpHost"];
        smtpPort = Convert.ToInt32(config["Email:Port"]);

        //
        // if something unespected happens throws a exception here
        // (missing config file, smtpPort not a int)
        // some kind of exception is thrown
        //
    }            
}


// the method that consumes the email service never get called
// the exception is raised by the the dot net during the IEmailService injection
[HttpPost]
public async Task<IActionResult> SendEmail([FromForm] SendEmailModel vm, [FromServices] IEmailService email)
{
   // actual code
}
...

在构造函数和 IsConfigured 标志内捕获

...
// service implementation
public class EmailService : IEmailService
{
    public bool IsConfigured { get; private set; }    // <-----------
    public EmailService(IConfiguration config, ILogger<EmailService> logger)
    {
        IsConfigured = false;
        try
        {
           smtpHost = config["Email:SmtpHost"];
           smtpPort = Convert.ToInt32(config["Email:Port"]);
           IsConfigured = true;   // <----------------
        }
        catch (Exception ex)
        {
           // 
        }
    }
}

[HttpPost]
public async Task<IActionResult> SendEmail([FromForm] SendEmailModel vm, [FromServices] IEmailService email)
{
   if (! email.IsConfigured)
      //handle
   }
}    
...

问题:
如何优雅地处理这种异常,而不会将用户重定向到丑陋的 catch-all-exceptions 错误页面或重构我所有实现此 IsConfigured 标志的服务?

谢谢!

4

0 回答 0