2010-07-07 91 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”方法,可以完成您所描述的操作 - 但仅限于在该命名空间中定义的设置。