假设我有一项发送电子邮件的服务。该类还需要 DI 来获取设置并添加记录器。这是一个简单的实现:
public interface IEmailService
{
public string From { get; set; }
public string To { get; set; }
public string Cc { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public bool Send();
}
public class EmailService: IEmailService
{
private readonly IOptions<EMailSettings> _settings;
private readonly IEmailLogService _logService;
public string From { get; set; }
public string To { get; set; }
public string Cc { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public EmailService(IOptions<EMailSettings> settings, IEmailLogService logService)
{
_settings = settings;
_logService = logService;
}
public bool Send()
{
SmtpClient smtpClient = new SmtpClient(_settings.SmtpHost);
MailMessage message= new System.Net.Mail.MailMessage(new MailAddress(From), new MailAddress(To));
message.Subject = Subject;
message.Body = Body;
if (Cc != null)
message.CC.Add(Cc);
smtpClient.Send(message);
logService.log();
return true;
}
}
现在我有另一个服务需要发送电子邮件
public interface ISomeService
{
public void SendEmails();
}
public class SomeService: ISomeService
{
private readonly IEmailService _emailService;
public SomeService(IEmailService emailService)
{
_emailService = emailService;
}
public void SendEmails()
{
// Send first email
_emailService.From = "[email protected]";
_emailService.To = "[email protected]";
_emailService.Cc= "[email protected]";
_emailService.Subject = "My Subject";
_emailService.Body= "My Message";
_emailService.Send();
// Send 2nd email
_emailService.From = "[email protected]";
_emailService.To = "[email protected]";
_emailService.Subject = "My Subject 2";
_emailService.Body= "My Message 2";
_emailService.Send();
}
}
您可以看到
_emailService
是共享成员,而我的第二封电子邮件无意中包含了上一封邮件中的抄送设置。除了必须清空字段之外,我如何创建多个不共享数据的 EmailService 对象?
那么您的第二封电子邮件仍然使用相同的
EmailService
实例,因此之前设置的所有属性仍可用于下次调用 Send()
您应该将电子邮件服务中的所有属性移出到充当请求正文的另一个类,然后该类也将成为 Send() 的参数,然后对于每封新电子邮件,您可以创建请求类的新实例,这应该可以解决问题