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

本文关键字:方法 值传 配置 SOLID 原则 使用 | 更新日期: 2023-09-27 18:18:16

我有一个email helper类,它有一个发送email的方法:

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

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

如果你想遵循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);
    }
}

现在您可以将实现替换为电子邮件服务和配置。我相信这遵循了坚实的原则。这对于单元测试也非常有用。