在开发实际的.NET应用程序,我们经常会用到.NET强大的应用程序配置功能(Application Configuration)。随着配置项的增多,配置文件也变得越来越长,而且非常不容易管理。另外,团队在协同开发时候,经常在不同的环境中需要不同的配置项或者同一个配置项需要设置成不同的值。比如,我们经常用"ConnectionStrings"来保存数据库连接字符串。可能每一个开发人员本地调试环境中的数据库连接字符串都不同。这样每次从源代码服务器上面同步配置文件后都需要重新修改里面的配置项值来支持本地调试。这篇博文就介绍怎样用多个文件管理.NET配置内容来方便我们日常的开发。
基本原则
根据我个人的经验,配置文件(Configuration File)管理过程中一般遵循下面的原则:
- 在app.config和web.config中只保留公共的、不经常变化的配置项目。这样能保证这个文件的基本稳定。
- 把和环境相关的配置项单独存放在一个独立的外部配置文件中,然后在主配置文件(app.config或者web.config)中引用该外部配置文件。例如,数据库连接字符串在"Staging"环境和"Product"环境中指向不同的数据库,我们就可以创建两个独立的外部配置文件"connectionstring_product.config" 和 "connectionstring_stage.config",并且把对应的数据库连接字符串值分别存在其中。
- 在使用.NET中的Application Setting功能时,把与此相关的配置项都放到一个独立的外部配置文件中,并在主配置文件中引用该外部配置文件。这是因为Application Setting相关配置项主要保存所有"setting"的默认值,经常会比较长,而且基本不会变化,把它存入一个独立的外部配置文件会比较方便我们日常对主配置文件的管理。
下面将具体说明怎样在主配置文件中引用外部配置文件。
具体实现
由于.NET 1.1和.NET 2.0中的配置文件管理机制不一致,我将分开讨论它们:
- .NET 1.1:在这个版本的.NET平台上,所有的配置项都在"<appsetting>"中。所以一个简单的方法是用"appSetting"的"file"属性来引用外部配置文件。如果外部配置文件存在,CLR就会读取外部配置文件并且用外部配置文件中的配置项值覆盖主配置文件中的配置项值。否则,CLR就直接使用主配置文件。
- .NET 2.0:在.NET 2.0中,配置项有各个不同的"section"组织。如"<appSetting>" section、"<connectionstrings>" section,用户还可以自定义自己的section。但是,所有的section中只有"<appsetting>"还继续保留了"file"属性(也同样保留做file属性的融合和覆盖配置项的机制),别的"section"都没有该属性。幸运的是所有section(包括appsetting)都拥有一个新的属性"configSource"。但是"configsource"的工作机制和原来的"file"属性不相同。如果你对一个section设了"configSource"属性(引用一个外部配置文件),则该section的所有配置项都来自外部配置文件,你不能同时在主配置文件中该Section中再定义新的配置项。因为"configSource"属性没有原来"file"属性的融合和覆盖机制了。例如:
在主配置文件(app.config 或者 web.config)中:
在外部配置文件"user.config"中:
更多资源
关于.NET的配置文件管理你可以参考下面的资源: