2013-12-20 99 views
0

感覺這應該有一個簡單的解決方案。在2個應用程序之間共享配置

我正在開發一個工具,它將有一些組件 - 它將開始作爲一個命令行工具,然後我們將打包在一個wpf應用程序中。該工具用於生成數據庫遷移腳本。這些將由源代碼控制,並位於每個用戶機器的特定位置。

我想將此位置存儲爲不需要提供給命令行程序的設置,並且可以在UI版本中進行設置。也可能有其他信息在這樣的程序之間共享是有用的(一次一次/很少的方式)。

我不想在代碼中有配置文件的硬編碼路徑,因爲這不會在程序的不同用戶之間移植。

我知道我可以將目錄名稱傳遞給命令行應用程序,也可以通過在其計算機上手動設置人員的應用程序配置來完成此操作。我不喜歡前者,因爲它是重複的,在命令行輸入路徑是一種痛苦,我不喜歡後者,因爲如果你需要改變它,那麼你必須弄清楚程序在做什麼,然後在隨機文件夾中進行挖掘手動修改文件(這又是非常可怕的!)。

這似乎應該解決問題,它可能是 - 我覺得我可能在某個地方錯過了一個把戲。

我對使用本地設置對象並不煩惱 - 在許多方面,我寧願它只是一個xml文件,因爲它使得升級或添加新東西變得更加簡單。

想法請!

回答

1
  1. 當程序第一次運行時,您只能向用戶索要一次目錄。然後,您將在設置中存儲提供的值並在之後使用它。當然,你必須提供一個可能性來稍後重寫這個值。
  2. 如果我正確理解你,你不想讓用戶在一些「奇怪的」文件夾中查找配置文件。如果是這樣,您可以考慮使用Environment.GetFolderPath以獲得路徑我的文檔,桌面或任何其他知名的目錄並保存設置。
  3. 至於設置。它們已經存儲爲XML。如果你不喜歡這個XML的結構,你可以創建你自己的自定義設置提供者(閱讀SettingsProviderAttribute)。您也可以輕鬆創建自己的解決方案。創建一個具有某些屬性的類並將其串行化或反序列化就足夠了,例如使用XmlSerialzier
+0

你能否提供更多關於如何使用設置來做到這一點的信息(我認爲默認的東西現在應該可以)。我是否需要保持不同項目中的設置同步?這似乎有點討厭。這些設置通常是透明地存儲的,你如何選擇他們去的地方?有人提到有Environment.AppData或類似的地方,所以這看起來像是要走的路。 –

+0

您可以使用configSource屬性將userSettings部分的內容移動到外部文件中。然後這個外部文件可以在兩個應用程序之間共享。但是,這種方法存在侷限性,因爲這個外部文件不能放在任何地方。它必須與主配置文件位於相同的目錄或子目錄中。如果你想要更靈活的解決方案,你必須寫你自己的設置提供商。 –

0

我推測,您可以使用machine.config來存儲全局可見條目。

您可以根據目標的.NET Framework找到它和OS位

  1. 對於.NET 2.0和3.5 - > c:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\
  2. 對於.NET 4。0 - >c:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\

我haven't't應用於應用machine.config中那些不是基於網絡。但是,值得一試。

您還可以在MSDN上找到一些示例代碼here

注意:如果您處於64位環境中,則有兩個machine.config文件。一個用於Framework64,另一個用於框架。確保它在正確的位置,或兩者兼而有之。

+0

硬編碼的路徑似乎不是一個好的方式去 - 我不能假設人們有一個C盤 –

+0

@JonnyLeeds,請仔細閱讀問題和建議的答案,然後再評論。我提到的是你可能找到.NET安裝和機器配置文件的位置,而不是任何硬編碼路徑。 – Nair

0

我正在研究的項目最終只是一些命令行工具的集合,其中一些建立在其他項目之上。

這些設置並非設計用於從命令行使用 - 我記錄了很多我在this other post中遇到的痛苦。在經歷了所有這些事情之後,我終於發現他們不工作交叉組裝 - 如果您調用具有另一個程序集設置的程序集,則會得到新設置,而不是其他程序集自行運行時使用的設置。

我最終解決這個問題的方法是手工完成。當它歸結到它,它並不難寫自己的東西

它的結構是非常相似的庫中的一個:

主類看起來是這樣的:

public class ProgramSettings 
{ 
    private readonly string _path; 
    private readonly List<Setting> _settings; 
    private readonly SettingProvider _settingProvider; 
    private readonly ConsoleWriter _writer; 

    public ProgramSettings(string programName, SettingProviderFactory settingProviderFactory, ConsoleWriter writer) 
    { 
     _writer = writer; 
     var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 
     var folder = Path.Combine(appData, companyName, programName); 
     _path = Path.Combine(folder, "settings.xml"); 
     _settings = new List<Setting>(); 

     if (!Directory.Exists(folder)) 
      Directory.CreateDirectory(folder); 

     _settingProvider = settingProviderFactory.GetProvider(_path, _settings); 
    } 

    public Setting Add(string name, string description) 
    { 
     var setting = new Setting(name, description); 
     _settings.Add(setting); 
     return setting; 
    } 

    public string Load() 
    { 
     _settingProvider.Load(); 
     _writer.WriteLine("using config at " + _path); 

     if (_settings.All(s => s.IsSet)) 
      return null; 

     _settingProvider.Save(); 

     var description = string.Join("\n", _settings.Where(s => !s.IsSet).Select(s => s.Description)); 
     return description + "\n need setting in config"; 
    } 
} 

的設置本身看起來是這樣的:

public class Setting 
{ 
    private readonly string _description; 
    public string Name { get; private set; } 

    public Setting(string name, string description) 
    { 
     Name = name; 
     _description = description; 
    } 

    public string Value { get; set; } 

    public string Description 
    { 
     get { return string.Format("{0}: {1}", Name, _description); } 
    } 

    public bool IsSet 
    { 
     get { return Value != null; } 
    } 
} 

除此之外,你只需要的東西,寫出基礎上設置的XML文件,我省略了再加上一些沉悶的我nterfaces +硬編碼的公司名稱,以求簡潔。

相關問題