c#SETTINGS架构

时间:2010-07-07 22:23:43

标签: c# architecture oop settings

我有几个需要读写应用程序设置的应用程序。由于其中一个应用程序是一个遗留的c ++应用程序,在注册表中有数百个设置(并且不会发生变化),并且还有一些以专有数据库格式存储的设置,我想知道如何将体系结构设置为允许单个界面读取和/或写入设置 一个想法是有一个巨大的枚举,每个可能的设置和一个拆分,根据一个巨大的案例陈述,将读/写请求指向正确的读者或作者。在注册表的情况下,这将需要进一步解析枚举的可能性以找到密钥的位置(如果它的Http设置在这里,如果它的设置设置它位于该密钥)。这整个想法让我觉得非OOP和太多的手动测试。请记住,大约有30个数据库设置,可能还有70个注册表设置。

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

1 个答案:

答案 0 :(得分:2)

我认为“大”的枚举可能有点讨厌 - 为什么不用命名空间来分解它们呢?到quote MSDN

  

通常最好定义一个枚举   直接在命名空间内   命名空间中的所有类都可以   以同样的方便访问它。   但是,枚举也可以嵌套   在类或结构中

所以你可以:

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

另外 - 你会声明枚举还是静态只读字段? (其中值是关键,并假设当你定义一个键时,你明确定义了它的来源 - 因此是键的价值)。

更好的想法是不定义特定于存储库的密钥,而是一个映射回AppSetting密钥的密钥 - 这就是您定义实际存储库特定密钥的位置。这样您就可以从 - 通过配置更改“设置”的位置,而无需重新部署应用程序。

所以,你有:

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”方法,它执行您所描述的内容 - 但仅适用于该命名空间中定义的设置。