我有几个需要读写应用程序设置的应用程序。由于其中一个应用程序是一个遗留的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);
}
}
答案 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模式的方法: