AppSettings In web.config

                                                                                                                                                  Written by K. Scott Allen 
                                                                                                                                                   Translated by jiangyh

      ASP.NET提供了一个灵活的配置文件管理功能。在这篇文章中我们将介绍一些使用技巧和最好的使用方法来让我们取得最好的结果。


      web.config
文件中的<appSettings>元素可以用来存储连接字符串、服务器名、文件路径或者其他各种各样的配置信息。appSettings中的这些配置信息结构或内容由于受系统环境的影响时常是变化的,例如,任何的数据库连接字符串在我们DB服务器从测试环境调整到真正的产品环境的时候都需要变更。

      看一下下面的例子,我们来练习一下如何从web.config文件中的<appSettings>段内取得连接字符串。Web.config的配置如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>   
  
<system.web>
    
<compilation defaultLanguage="c#" debug="true" />
  
</system.web>
  
<appSettings>
    
<add key="ConnectionInfo" value="server=(local);database=Northwind;Integrated Security=SSPI" />
  
</appSettings>
</configuration>

   使用命名空间System.Configuration下的ConfigurationSettings类去取得连接字符串的内容,代码如下:

 1private void Page_Load(object sender, EventArgs e)
 2{
 3  string connectionInfo = ConfigurationSettings.AppSettings["ConnectionInfo"];
 4
 5  using(SqlConnection connection = new SqlConnection(connectionInfo))
 6  {
 7    connection.Open();
 8    // perform work with connection
 9  }
         
10}


   一般情况下一些应用程序中会将上面的代码复制到整个系统的很多地方,如果我们仔细的考虑一下,这在未来可能是个很麻烦的事情。

第一,我们通过不可变的代码(hard code)去取得web.config文件中的连接字符串,虽然比较容易实现,但是在连接字符串需要变化的时候很难去适应变化。

第二,这样的代码会让我们这部分配置信息完全束缚在web.config文件的appSettings中,使用web.config只是一个保存设置的办法,在未来我们可能会发现我们需要从数据库中取得这些设置信息或者改变这些配置信息从应用程序范围变化到每个客户的级别的SessionCookie中的时候,都会有很多束缚。

 

   封装

 

   让我们使用一个类中的静态属性来保存这个连接字符串。


 1using System.Configuration;
 2namespace aspnet.config
 3{
 4  public class Configuration
 5  {
 6    public static string ConnectionInfo
 7    {
 8      get
 9      {
10        return ConfigurationSettings.AppSettings["ConnectionInfo"];
11      }

12    }

13  }

14}


   现在我们的Page_Load方法就像下面的代码一样。

1private void Page_Load(object sender, EventArgs e)
2{
3  using(SqlConnection connection = new SqlConnection(Configuration.ConnectionInfo))
4  {
5    connection.Open();
6    // perform work with connection
7  }
         
8}

   这样的改变可以使我们上面的代码变的相对的小一些,但是更强大。现在Page_Load方法不知道将取得到什么样的连接字符串。我们可以很容易的改变ConnectionInfo属性,从不同的代码中取得连接字符串,并且不用修改其它使用这个属性的代码。我们也不需要去记住连接字符串的键值并且复制到程序中的很多地方。反而,当我们访问Configuration类去取得需要的配置信息的时候,可以利用Visual Studio Intellisense。这个key在系统中只出现一次,所以我们可以再次改变连接字符串的key,而只需要修改一行代码。

 

   当然这个方法就是原本所有代码从web.config文件中取得配置信息变化成了通过访问Configuration类来取得。我们还需要在Configuration类中增加所有的属性来匹配web.config中的配置信息。

 

   这个方法的另外一个优点就是如果我们的配置信息的内容不是一个字符串的时候,例如是日期类型,数字类型或者原始的类型,在这种情况下,我们可以在Configuration类中的ConnectionInfo中进行适当的转型来返回我们需要的类型。

 

   你将注意到了我提供了一个read-only属性给ConnectionInfoweb.config不是一个不被更新的常量。ASP.NET程序在运行的时候可以检测到web.config文件是否有变化。当ASP.NET程序发现你更新了web.config文件,任何的处理信息,例如Session, Application Cache都将会丢失(如果session没有存放在state服务器或者数据库中的时候)。

 

   下面,让我们来看看appSettings的一些其他特点。

 

   多文件配置

 

   appSettings元素可以包含一个文件属性来指向一个扩展的文件。让我像下面一样改变一下我们的web.config文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>   
  
<system.web>
    
<compilation defaultLanguage="c#" debug="true" />
  
</system.web>
  
<appSettings file="testlabsettings.config"/>
</configuration>

   下面我们来创建一个新的文件[testlabsettings.config],并且增加一个appSettings段和连接字符串的信息。

<appSettings>
  
<add key="ConnectionInfo" value="server=(local);database=Northwind;Integrated Security=SSPI" />
</appSettings>

   如果这个扩展文件是可见的,ASP.NET能够包含web.configappSettings段的配置信息和扩展文件的配置信息。如果一个key/valueweb.config文件中和扩展文件中都存在的情况下,ASP.NET将使用扩展文件的值。

 

   当你保持用户特定或者环境特定的配置信息在扩展文件里的时候,上面的例子将非常有用。当每一个用户或者安装的网站需要包含他们自己的配置文件的时候,请让web.config来包含这些文件并把这些配置信息作为一个全局的实例来使用。这个方法可以很容易去围绕这个全局的web.config文件变化并且也可以将web.config文件封装到控件里,而每个开发人员还可以得到他自己的设置。

 

   有一点需要警告,ASP.NET程序无法在运行的时候检测到扩展文件的变化,你将需要手动改变web.config文件本身来启动一个新版本的ASP.NET程序

 

   我希望本文可以在最大的程度上提供给你一些appSettings段的小技巧,如果需要更好的方法去处理配置信息,请去下载Enterprise Library