delphi - 将配置传递给与应用程序无关的模块的最佳方式是什么?

标签 delphi configuration-management

我正在开发一个由多个模块组成的应用程序,这些模块也将用于其他应用程序。这些模块中的每一个都需要一些配置选项,但不应该知道其他模块的选项,也不应该要求其他模块存在。一些设置在模块之间共享。

假设模块 A 需要设置 x 和 y,模块 B 需要设置 y 和 z。

设置存储在注册表或一个或多个 .ini 文件中。

到目前为止,我已经考虑了以下方法:

  • 有一个全局单位(“global.pas”)
    包含在所有模块中,并且
    包含全局变量
    设置。我不喜欢这种方法
    非常因为它需要
    所有应用程序都有这样一个单元
    它一定会收集到很多
    没有任何意义的附加代码
    按照原来的目的去做。所以
    最终每个应用程序将
    有自己不兼容的全局
    单元。
  • 每个模块的配置类都包含该模块所需的所有设置。这些从应用程序的某个中心点传递到模块中,该应用程序还处理读取和写入它们到某种永久形式(例如使用 JvAppStorage)。这需要模块之间进行一些同步,因为某些选项将在它们之间共享,因此如果在一个模块中更改了选项,则此更改必须以某种方式反射(reflect)在另一个模块的配置中(不一定是实时的,而是下一次模块已初始化)。
  • 具有传递给每个模块的通用配置类,其中包含所有模块的设置作为属性。每个模块只访问它知道的那些设置。这里的问题可能是名称冲突可能会在不被注意的情况下发生。此外,我不喜欢传递模块不需要的配置选项的想法。此外,每个应用程序都将包含不同的模块子集,但最终会包含相同的配置类以及所有可能模块的选项。 (这与上面的全局单位方法没有太大区别。)
  • 像上面一样,有一个传递给每个模块的通用配置类。但是模块没有属性,而是通过名称访问它们的设置(在最简单的情况下,这可能是 TCustomIniFile)。这避免了所有应用程序中所有模块的设置,但引入了可能的类型兼容性问题,并且名称冲突可能再次成为问题(除非每个模块都为其选项加上其名称的前缀,但它们不能再共享选项)。

  • 我想每个编写模块化系统的人都面临过这个问题,并找到了一些他们后来坚持使用的解决方案,无论他们是否仍然喜欢它们。我也去过那里,几次,仍在寻找金子弹。

    也许其他人已经找到了理想的解决方案?

    (这是 Delphi 2007 以防万一。我已经在使用 JCL/JVCL。)

    最佳答案

    我可能会创建一个通用配置类,并让每个模块依赖于一个或多个作为单例的具体配置类。一个模块依赖于一个配置类实例,其设置仅对该模块重要,并且可选地依赖于一个或多个其他配置类实例,其设置与多个模块有关。由于配置对象是单例的,共享配置对象的模块会自动获得相同的设置。

    您将根据功能创建配置类,而不是根据模块使用情况。模块使用的功能暗示它将需要哪些配置对象。

    添加到应用程序的每个模块都将所有需要的配置类作为依赖项添加,其他配置类不会添加。单例配置对象在应用程序启动时将自己添加到此类对象的列表(或注册表,如果您愿意的话)。应用程序本身不需要了解详细信息,只需从持久存储加载和保存设置就足够了。如果需要,它可以 OTOH 使用相同的基础设施。

    一般来说,我会根据接口(interface)来实现所有东西,而将持久性机制留在外面。因此,您以后可以自由地在 INI 文件、注册表甚至数据库中进行配置(这将为您提供一种实现配置更改历史的简单方法)。我发现自从我开始针对接口(interface)而不是类层次结构进行编程以来,我并没有将自己锁定在一种做事方式上。

    关于delphi - 将配置传递给与应用程序无关的模块的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/482590/

    相关文章:

    git - 如何管理 git 存储库中的 IDE 文件?

    linux - 使用 cfengine 在 linux 系统上修复用户列表

    Delphi 'duplicate content' 库或示例

    delphi - VirtualTreeView 和 VCL 样式

    Delphi 7从路径获取文件夹名称

    oracle - 应用程序配置管理的工具和过程

    android - 如何以编程方式在 ListBox 项中添加图像?

    delphi - 如何以编程方式更改 TWebBrowser 中的字体

    version-control - 配置管理和版本控制有什么区别?

    ansible - 在ansible中使用连字符