65.9K
CodeProject 正在变化。 阅读更多。
Home

动态应用程序配置解决方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (5投票s)

2007年8月7日

CPOL

3分钟阅读

viewsIcon

37322

downloadIcon

409

另一种在 .NET 应用程序中使用复杂的可更新配置的简单方法

Screenshot - ConfigBuilder.jpg

引言

我们在 .NET 2.0 中有几种选择来处理应用程序

优点 缺点
标准配置文件中的appSettings部分
  • 简单的现有 API
  • web.config 中的更改立即反映在应用程序中
  • 只能存储名称-值字符串对
  • 应用程序需要重新启动才能接受外部更改
自定义配置节
  • 可以存储复杂数据
  • 应该为每个配置结构实现
  • 实现不是很直观
  • 应用程序需要重新启动才能接受外部更改
applicationSettings节 & 设置文件
  • 标准 API
  • 内置(在 Visual Studio 2005 中)用于简单类型的编辑器,支持设计时绑定
  • 可以从应用程序代码写入
  • 复杂类型可以存储在 ArrayList
  • 对复杂类型的支持有限
  • 应用程序需要重新启动才能接受外部更改

挑战

那么我想要什么呢?

  • 我想从配置存储中存储和检索任意类。
  • 如果配置在两次后续尝试配置之间发生更改,则后续访问应反映更改。
  • 我太懒了,无法为每个类构建实现,我必须存储。

解决方案

此解决方案基于使用任何方便的架构中的 XML 配置文件。配置由表示存储在配置文件中的数据的类和负责存储、检索和缓存配置数据的管理器组成。管理器使用简单的 XML 序列化/反序列化来读取/写入数据。配置文件路径存储在标准应用程序配置文件中。 System.Web.Caching.Cache 用于缓存配置数据。

那么实现呢?为了解决我的懒惰问题,我构建了一个简单的实用程序,可以从 XML 配置文件生成整个实现。您只需要提供配置文件路径、输出目录和所需的命名空间。

Using the Code

在您可以下载的源代码存档中有三个项目的解决方案。所有实际的代码生成工作都在 DynamicConfiguration 类库中完成。 ConfigGenerator 是一个 WinForm 实用程序,可让您选择配置文件并从中生成代码。最后一个是一个示例项目,演示了配置用法。

// Get configuration
Sample cnfg = SampleConfigurationManager.Data;

// Access configuration data
MessageBox.Show(String.Format("Configured screen width: {0}", cnfg.Screen.Width));

// Alter configuration
cnfg.Screen.Width = 640;
cnfg.Screen.Height = 480;

// Save configuration
SampleConfigurationManager.Save();

关注点

要从 XML 文件构建类,我们需要首先创建 XML 架构。通常,您可以使用 xsd.exe 实用程序、Visual Studio 2005 中的 XML 编辑器或使用其他工具(例如 XML Spy)来执行此操作。 xsd.exe 生成的架构对我来说不够好,因为它与数据集结构兼容,并且在某些情况下会生成未类型化的结果。例如,尝试使用此简单 XML 从 xsd.exe 生成 XSD 和类

<Test>
   <AAA>
      <Value>5</Value>
   </AAA>
   <BBB>
      <Description>Sample</Description>
   </BBB>
</Test>

要创建架构,我放弃了 XSD 实现(它只是将 XML 加载到 dataset 中并使用 GetXmlSchema 方法检索架构),而是使用了 XmlSchemaInference 类。此类是 System.Xml.Schema 命名空间的一部分;它在 .NET 2.0、3.0 中受支持,如果您使用 XML 架构,则不应忽略它。

另一个值得关注的点是使用 System.Web.Caching.Cache 对象。显然,很多人不知道它可以在 Web 上下文之外使用。以下代码确保它可以从 Web 应用程序和常规 Windows 应用程序中使用

private static Cache cache
{
   get
   {
      if (HttpContext.Current == null)
         return HttpRuntime.Cache;

      return HttpContext.Current.Cache;
   }
}

历史

  • 2007 年 8 月 7 日:首次发布
© . All rights reserved.