使用SOLID原则将配置值传递给方法

时间:2014-08-15 19:03:35

标签: c# .net oop design-patterns solid-principles

我有一个电子邮件助手类,其中包含一个发送电子邮件的方法:

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原则。)

1 个答案:

答案 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原则。这对于单元测试也非常有用。