2011-10-05 60 views
1

我正在嘗試編寫一個可以提供來自不同提供程序(例如設置文件,環境變量,數據庫等)的配置設置的配置管理器。我是否應該使用泛型來簡化我的配置提供者類?

我已經預想到的設置將是要麼字符串,整數或雙打,並通過經班提供

設置的名稱,實施這個標識:

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); 

上午我在正確的方向前進?

回答

3

使用Convert.ChangeType

return (T)Convert.ChangeType(value, typeof(T)); 
+0

乾杯。我會認爲這是一個暗示「是的,這是正確的方法」:) –

1

我有一個大體相似變量提供商的接口,這是我沒有使用泛型。我從泛型開始,發現它並沒有使代碼更具可讀性或表現性,特別是因爲類型很少,並且從一開始就知道。畢竟,你沒有獲得任何動態的東西,它是從你給出的默認值推斷出的類型。我還希望我的變量提供程序在沒有提供默認值的情況下可用,並且不希望爲此使用不同的語法。

所以我的礦井由兩個層次組成。一個是公共接口提供者,我在代碼中使用,它可以在這些例子中使用,如:

IVariableProvider var; 

// providing default value 
double pi = var.Double["pi", 3.14159]; 

// no default value, also bool is just an int, converted by the IVariableProvider. 
bool answer = var.Bool["answer"]; 
int number = var.Int["number"]; 


if(var.Str.ContainsKey("text")) 
{ 
    string text = var.Str["text"]; 
    ... 
} 

如果需要的話我可以爲var.Float,var.Long等添加公共接口。

在下面,IVariableProvider可以被賦予不同的「來源」來獲取變量。源只顯示字符串和整數。它也可以使用其他IVariableProvider作爲來源。當我打電話給var.Double["pi"]時,它會檢查是否有任何來源可以爲鍵「pi」提供一個字符串變量,然後返回它。

最終,你可以這樣做。如果你使用那樣的泛型,然後想使用它沒有默認值,你將不得不使用不同的語法來指定類型。

+0

非常好,謝謝你給我一些想法。 –

相關問題