Let’s day I have a service that sends emails. This class also needs DI to get settings and add a logger. Here’s a trivial implementation:
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;
}
}
Now I have another service that needs to send emails
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();
}
}
You can see that _emailService
is a shared member and my 2nd email inadvertently has a Cc set from the previous message. Other than having to blank out fields how can I create multiple EmailService objects that don’t share data?