gpt4 book ai didi

c# SETTINGS 架构

转载 作者:太空宇宙 更新时间:2023-11-03 11:46:47 25 4
gpt4 key购买 nike

我有几个应用程序需要读取和写入应用程序设置。由于其中一个应用程序是一个遗留的 c++ 应用程序,在注册表中有数百个设置(并且不一定会更改)并且还有一些设置以专有数据库格式存储,我想知道如何将架构设置为允许在单一界面中读取和/或写入设置。
一个想法是有一个巨大的枚举,其中包含所有可能的设置,并根据巨大的 case 语句将读/写请求定向到正确的读取器或写入器。在注册表的情况下,这将必须进一步解析枚举可能性以找到键的位置(如果它是一个 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);
}
}

最佳答案

我认为“大”枚举可能有点令人讨厌——为什么不使用 namespace 将它们分解;至 quote MSDN :

Usually it is best to define an enum directly within a namespace so that all classes in the namespace can access it with equal convenience. However, an enum can also be nested within a class or struct

所以你可以:

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

此外 - 您会声明枚举或静态只读字段吗? (值是键的地方,并假设当您定义键时,您明确定义了它的来源 - 因此是键的值)。

一个更好的主意是不定义存储库特定的 key ,而是映射回 AppSetting key 的 key - 这就是您定义实际存储库特定 key 的地方。这将允许您通过配置更改从何处获取“设置”,而无需重新部署应用程序。

所以,你有:

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">

唯一的障碍是,这只会帮助将 key 分解为更合乎逻辑且更易于处理的区域——您仍然有解决存储库的问题。如果你真的想抽象出来,你需要序列化一个简单的类

  • key
  • 值(value)
  • 存储库

switch 语句的想法还不错,但您也可以在这里采用相同的方法,使用一种基于 Facade 或 Factory 模式的方法:

  • 具有从存储库获取设置的各种具体方法。
  • 在每个命名空间中(根据 ESetting 枚举)都有一个“GetSettings”方法来执行您所描述的操作 - 但仅适用于该命名空间中定义的设置。

关于c# SETTINGS 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3199372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com