Effective C# Item37:使用标准配置机制
为了避免在程序中使用过多的“硬编码”,我们一般要把一些会影响到程序执行方式的变量导出到外部文件中,这样我们可以通过简单的修改文件的方式,达到改变程序行为的目的。
我们一般不推荐将变量导出到外部ini文件中,因为这种类型的文件结构受限,而且可能会和其他应用程序的文件名发生冲突;我们也不推荐将变量导出到注册表中,因为一方面操作注册表需要管理员的权限,而一般用户应该不会拥有管理员的权限,另一方面,如果不恰当的操作注册表,很容易对机器造成严重的损坏。
我们推荐将变量导出到XML文件中。.NET针对XML配置文件提供了丰富的支持,它本身已经定义了一些结构,例如appSettings,这个节点中的内容应用于Web和桌面应用程序,当程序启动时,CLR会读取这部分数据,将其中的内容以键值对的方式存储在应用程序的NameValueCollection属性中。
ASP.NET应用程序的配置文件会更加灵活一些,它可以在每一层虚拟目录中建立一个名为web.config的配置文件,用于配置该层虚拟目录中所有文件的属性,例如:http://localhost/MyApplication/SubDir1/SubDir2/file.aspx,这个URL可以使用四个配置文件:machine.config文件、位于MyApplication目录中的web.config配置文件,然后依次是SubDir1和SubDir2目录中的web.config配置文件。
在桌面应用程序中,只有一个配置文件,该配置文件和可执行文件在同一个目录中,命名规则:<应用程序名称>.<扩展名>.config。
我们在解析配置文件时,有两种方式:一种是使用平时常见的读写XML文件的方式,使用XmlReader进行读取;另一种方式是采用序列化的方式,按照配置文件中的结构创建一个DataModel,然后利用序列化和反序列化,对配置文件进行读取和存储。我们推荐使用第二种方法。
关于配置文件的存储位置,有以下三种方式:
- 全局全用户应用程序数据目录,通过Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);方式取得,该目录用来存储由所有机器上的所有用户共享的信息,通常我们需要使用安装程序或者管理模块来对该目录进行读写,一般的应用程序不推荐使用该目录。
- 全局单用于应用程序数据目录,通过Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);方式取得,该目录用于存储当前用户的应用程序数据信息,用户无论通过本地登录还是网络远程登录,都可以使用这个目录。
- 本地单用户数据目录,通过Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);方式取得。用户只有在本地登录机器时,才可以访问这个目录。
我们一般不推荐将配置文件放置在Program Files目录或者Windows目录下,因为这两个目录都数据比较敏感的目录,很可能用户没有对这两个目录的操作权限。