我正在嘗試編寫一個可以提供來自不同提供程序(例如設置文件,環境變量,數據庫等)的配置設置的配置管理器。我是否應該使用泛型來簡化我的配置提供者類?
我已經預想到的設置將是要麼字符串,整數或雙打,並通過經班提供
設置的名稱,實施這個標識:
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);
上午我在正確的方向前進?
乾杯。我會認爲這是一個暗示「是的,這是正確的方法」:) –