我所知道的最佳实践是避免从库中的类,甚至一般类中直接依赖 app.config/web.config。这并不意味着您不使用 app.config。这意味着您的班级不知道他们正在使用它。
例如,
public class MyClassThatDependsOnSomeSettings
{
private readonly ISettings _settings;
public MyClassThatDependsOnSomeSettings(ISettings settings)
{
_settings = settings;
}
public void DoSomething()
{
var settingA = _settings.SettingA;
}
}
public interface ISettings
{
int SettingA {get;}
string SettingB {get;}
}
现在可以考虑MyClassThatDependsOnSomeSettings
完成了。它不需要对 .config 文件进行任何访问。它只需要一个实现的实例ISettings
。这可以从 .config 中读取。
public class SettingsFromConfiguration : ISettings
{
public int SettingA
{
get
{
string setting = ConfigurationManager.AppSettings["settingA"];
int value = 0;
int.TryParse(setting, out value);
return value;
}
}
public string SettingB
{
get { return ConfigurationManager.AppSettings["settingB"];}
}
}
看起来这只是移动事物并做同样的事情吗?几乎可以。最大的区别在于,虽然您可以使用ISettings
从 app.config 读取的实现,但您也可以编写其他实现。您可以编写一个使用硬编码值的程序,您可以编写一个自定义配置部分而不是 using AppSettings
,或者如果您有一个带有 JSON 配置文件的应用程序并且没有AppSettings
您的类仍然可以工作。
这适用于依赖倒置,这意味着类应该依赖于抽象(如接口)而不是具体的实现。
在构造函数中添加一个要求ISettings
称为依赖注入,特别是构造函数注入。