我有一个电子邮件助手类,其中包含一个发送电子邮件的方法:
private static class EmailHelper
{
public static void SendEmail(string from, string to, string subject, string message)
{
MailMessage msg = new MailMessage(from, to, subject, body);
var client = new SmtpClient("my.smpthost.com"); //this will be moved to config.
client.Send(msg);
}
}
我的smtp主机字符串将放在我的配置文件中。问题是将smtp主机传递给此方法的推荐方法是什么?我应该在这个类中有一个构造函数来接受smtp字符串吗?或者,我应该将smtp作为第五个参数传递?或者这个方法应该直接从配置中读取吗?
(我意识到可能有几种不同的方法可以做到这一点,但我试图理解推荐的方法,或者至少是不推荐的方法,记住SOLID原则。)
答案 0 :(得分:1)
如果您想遵循SOLID原则,我会以不同的方式设计代码。目前,使用EmailHelper的所有代码都依赖于这种确切的实现。
我会创建两个接口。像这样:
public interface IConfiguration
{
string GetConfigurationValue(string key);
}
public interface IEmailHelper
{
void SendEmail(string from, string to, string subject, string message);
}
然后你可以像这样实现EmailHelper:
public class EmailHelper : IEmailHelper
{
private readonly IConfiguration _configuration;
public EmailHelper(IConfiguration configuration)
{
_configuration = configuration;
}
public void SendEmail(string from, string to, string subject, string message)
{
MailMessage msg = new MailMessage(from, to, subject, body);
var client = new SmtpClient(_configuration.GetConfigurationValue("smpthost")); //this will be moved to config.
client.Send(msg);
}
}
现在,您可以替换电子邮件服务和配置的实现。我相信这遵循SOLID原则。这对于单元测试也非常有用。