配置系统的设计指南?

时间:2011-05-20 20:31:59

标签: oop design-patterns architecture configuration

我的大部分编程都是基于网络的应用程序,尽管我已经为个人项目做了一些桌面应用程序开发。一个反复出现的设计问题是如何管理配置。例如,我们都知道在ASP.NET中,web.config经常用于保存配置信息,无论是生成还是手动配置。

在我知道什么是设计模式之前,我会实现一个本质上是Singleton模式的东西。我写了一个静态类,它在启动时会读取配置文件并将信息以及任何自动生成的信息存储在字段中,然后通过某种访问器将这些信息暴露给应用程序的其余部分(属性) ,get()方法......)。

我心中的某些东西一直告诉我,这不是最好的方法。所以,我的问题是,是否有任何设计模式或指南来设计配置系统?配置系统何时以及如何读取配置,以及如何将此信息公开给应用程序的其余部分?应该是单身人士吗?我不是要求推荐的存储机制(XML与数据库对文本文件......),尽管我也对这个问题的答案感兴趣。

2 个答案:

答案 0 :(得分:1)

听起来不像警察,但它真的完全取决于你的应用程序。非常简单的应用程序(听起来像你在谈论基于Web的应用程序,所以我会跳过胖客户端),通常只需要全局配置(你可以使用web.config和单例)和每用户配置(用户表) ,并且可能链接的配置表或名称/值对表可以处理。

更复杂的应用程序可能需要一个可保护和可覆盖的完整配置层次结构。例如,我可能有几个应用程序定义的默认值,可以为用户所属的每个组覆盖,用户自己,最后是用户无法覆盖的特定组或用户的管理员定义值。 / p>

为此,我通常使用单例“root config”对象,该对象具有在每个级别公开层次结构和配置属性的其他级别的方法。根负责解析层次结构,但如果需要(例如设置配置),您可以自己遍历层次结构以处理特定于层次结构中的单个级别的设置。

最后,还有延迟问题。如果您希望配置设置经常更改,请在每次请求时从存储中读取它们是最好的,但是最昂贵。

如果没有,您可以缓存设置以及“上次读取”日期,并在到期时间之后将设置值重新读入缓存。

答案 1 :(得分:1)

Guidlines:

考虑管理设置

  • 他们多久更换一次?
  • 如何改变它们以及如何做到这一点?

E,G web.config更改需要具备技术技能的人,并导致应用程序在更改时重置;其中 - 由系统提供的UI访问的设置不会出现这些问题。

安全

  • 您需要加密任何设置吗?
  • 您是否需要隔离设置,以便只有某些人才能访问某些设置?
  • 您是否需要提供任何变更审核?

命名约定

  • 有一些。
  • 我强烈建议使用基于URI的方法来设置密钥 - 这有助于避免不同组件之间不同设置之间的冲突(可能是当您开始向系统添加第三方组件时 - 或者当您将其添加到其他人的组件时)。
  • 基于URI的键也使其易于维护,因为更容易看到设置适用于什么。
  • 您可以使用不同的命名“架构”,如果可以,我喜欢镜像代码结构,但有时您可能想要遵循业务流程之类的其他内容。
  • 请勿使用“DatabaseConnection”等含糊不清的名称。

基于URI的关键示例:

   <appSettings>
        <add key="Morphological.RoboMojo.BusinessLogic.IJobDataProvider" value="Morphological.RoboMojo.XmlDataProvider.JobDataProvider, Morphological.RoboMojo.XmlDataProvider"/>
        <add key="Morphological.RoboMojo.BusinessLogic.ITaskDataProvider" value="Morphological.RoboMojo.XmlDataProvider.TaskDataProvider, Morphological.RoboMojo.XmlDataProvider"/>
        <add key="Morphological.RoboMojo.XmlDataProvider.NameAndPathOfDataFile" value="C:\Program Files (x86)\Morphological Software Solutions\RoboMojo\RoboMojoState.txt"/>
        <add key="Morphological.RoboMojo.XmlDataProvider.PathOfDataFileBackups" value="C:\Program Files (x86)\Morphological Software Solutions\RoboMojo\RoboMojoState Backups"/>
        <add key="Morphological.RoboMojo.BusinessLogic.ITaskExecutorProvider" value="Morphological.RoboMojo.TaskExecutorMSRoboCopy.RoboMojo, Morphological.RoboMojo.TaskExecutorMSRoboCopy"/>
        <add key="Morphological.RoboMojo.TaskExecutorMSRoboCopy.LocationOfRoboCopyEXE" value="C:\Windows\System32\RoboCopy.EXE"/>
    </appSettings>