2010-07-07 126 views
2

我有幾個應用程序需要讀取和寫入應用程序設置。由於其中一個應用程序是一個傳統的C++應用程序,在註冊表中有數百個設置(並且不會改變),並且還有一些設置以專有數據庫格式存儲,所以我想知道如何將該體系結構設置爲允許單個接口用於讀取和/或寫入設置。
一個想法是在那裏有一個巨大的枚舉,每一個可能的設置和一個分裂,指導基於巨大的病例陳述的讀/寫請求到正確的讀者或作者。在註冊表的情況下,這將不得不進一步解析枚舉可能性來找到密鑰的位置(如果它的Http設置在這裏,如果它的安裝設置位於此密鑰)。這整個想法讓我覺得非OOP和過多的手動測試。請記住,大約有30個數據庫設置,可能有70個註冊表設置。c#設置體系結構

public class SettingsTest 
{ 
    public enum ESetting 
    { 
     HttpUserName, HttpPassword, SetupAllowPublic, //db server stored 
     HttpProxyUsername, HttpProxyPassword, PublicOrPrivate //registry stored 
    } 

    public string GetSetting(ESetting setting) 
    { 
     if (IsSettingInRegistry(setting) 
      return RegHandler.GetFromRegistry(setting); 
     else 
      return DBHandler.GetFromDB(setting); 
    } 
} 
+0

您正在重新發明一個輪子(或更多)。 – leppie 2010-07-08 04:32:20

+0

什麼車輪?什麼重塑?有幫助嗎? – rediVider 2010-07-08 15:27:03

回答

2

我認爲「大」的枚舉可能有點討厭 - 爲什麼不用命名空間分解它們;到quote MSDN

一般最好是直接在命名空間中定義一個枚舉 使得 具有相等方便命名空間中的所有類可以 訪問它。 然而,枚舉也可以在類或結構內嵌套

所以你可以有:

RediVider.EnterpriseApp.DataAccess.ESettingsKeys 
RediVider.EnterpriseApp.BusinessLogic.ESettingsKeys 
RediVider.EnterpriseApp.ComponentXXX.ESettingsKeys 

而且 - 你會被宣佈枚舉,或靜態只讀域? (其中值是關鍵,並且假設當你定義一個關鍵字時,你明確地定義了它來自哪裏 - 因此關鍵的價值)。

更好的辦法是不定義一個存儲庫特定的鍵,而是一個映射回AppSetting鍵的鍵 - 這就是您定義實際的存儲庫特定鍵的位置。這將允許您通過config更改從何處獲取「設置」,而無需重新部署應用程序。

所以,你必須:

namespace RediVider.EnterpriseApp.DataAccess 
{ 
    Public class ESettingsKeys 
    { 
    // Note - AppSetting Keys are "namespaced" to match: 
    public readonly string SetupAllowPublic = "RediVider.EnterpriseApp.DataAccess.SetupAllowPublic"; 
    } 
} 

然後在你的配置(僞代碼):

<AppSetting Key="RediVider.EnterpriseApp.DataAccess.SetupAllowPublic" value="/System/Settings/Blah/SetupAllowPublic"> 

唯一的障礙是,這不僅有利於分手鍵劃分爲多個邏輯並且更容易處理各個領域 - 您仍然有解決資源庫的問題。如果你真的想抽象的說出來你需要序列化一個簡單的類,有

  • 重點
  • 價值

switch語句的想法並非如此不好,但你也可以採用同樣的方法,使用一種基於Facade或Factory模式的方法:

  • 有各種混凝土從存儲庫獲取設置的方法。
  • 在每個命名空間中(根據ESetting枚舉)都有一個「GetSettings」方法,可以完成您所描述的操作 - 但僅限於在該命名空間中定義的設置。