问题:
我有一个简单的范围电子邮件发件人服务。该服务依赖于在构造函数中注入的配置。
如果配置文件中缺少预期的部分,电子邮件服务会在构造函数中引发异常。
如果不在构造函数的服务中放置 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 标志的服务?
谢谢!