我正在尝试编写一个可以提供来自不同提供程序(例如设置文件,环境变量,数据库等)的配置设置的配置管理器。我是否应该使用泛型来简化我的配置提供者类?
我已经预想到的设置将是要么字符串,整数或双打,并通过经班提供
设置的名称,实施这个标识:
public interface IConfigurationManagerProvider
{
T GetSetting<T>(string name);
IEnumerable<ConfigurationSetting> GetKnownSettings();
}
作为一个开始,我想写一个供应商返回的环境变量
public class EnvironmentVariableProvider : IConfigurationManagerProvider
{
public T GetSetting<T>(string name)
{
string value = Environment.GetEnvironmentVariable(name);
return value as T;
}
public IEnumerable<ConfigurationSetting> GetKnownSettings()
{
return new List<ConfigurationSetting>
{
new ConfigurationSetting("MY_TRACING", typeof (String)),
};
}
}
但是这不会编译,因为它不能转换为T. 我F I把一个类约束在那么这限制了我为字符串
public T GetSetting<T>(string name) where T : class
{
string value = Environment.GetEnvironmentVariable(name);
return value as T;
}
真的该供应商只能提供一个字符串(其他供应商将是不同的),但是我要访问的配置设置的代码,以尽可能干净使用类似:
public interface IConfigurationManagerConsumer
{
T GetConfiguration<T>(string name, T systemDefault);
}
像这样使用:
string tracing = ConfigurationManager.GetConfiguration("MY_TRACING", "Unknown");
或本:
int maxUserCount = = ConfigurationManager.GetConfiguration("Max User Count", 10);
或本:
double pi = ConfigurationManager.GetConfiguration("PI", 3.14159);
上午我在正确的方向前进?
干杯。我会认为这是一个暗示“是的,这是正确的方法”:) –