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

清理臃肿的 Web.Config!易于使用的应用程序设置管理器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.36/5 (21投票s)

2004 年 12 月 3 日

8分钟阅读

viewsIcon

85484

downloadIcon

755

一个应用程序设置管理器,可让您快速分类和管理所有那些杂乱的应用程序设置,这些设置正在充斥您的 web.config 文件。此外,您还可以让最终用户使用提供的编辑器管理自己的设置。

Sample Image - AppSettingsConfigure.jpg

引言

大多数规模的应用程序都需要应用程序设置。虽然 web.config 文件使用 ConfigurationSettings.AppSettings["..." 语法提供了一种方便的方式来存储和检索应用程序设置,但如果设置超过几个,它可能会变得很麻烦。此外,使用 ConfigurationSettings.AppSettings 访问的应用程序设置都集中在一起。能够将它们分组到类别中会很方便。虽然可以通过 web.config 中的子节来实现这一点,但这需要一些编码。也许最重要的是,通常需要允许最终用户或管理员编辑应用程序设置。

本文介绍了一个应用程序设置管理器,它允许您快速轻松地管理大量应用程序设置。应用程序设置管理器具有以下功能:

  1. 设置按类别分组。
  2. 轻松管理大量设置。
  3. 设置编辑器使最终用户可以轻松地编辑设置。
  4. 编辑器以“配置设置”模式运行。在此模式下,可以轻松创建新设置并将其分组到类别下。
  5. 设置具有关联的描述。描述在编辑时显示在设置旁边,以指导编辑设置的人。
  6. 运行时引用设置遵循与引用 web.config 中的 appsetting 类似的语法。
  7. 帮助程序语法允许您引用整数或布尔设置,而无需将其从字符串转换为其他类型。

存储和检索设置

设置存储在两个小型 SQL 表中:Settings 和 SettingCategories。Settings 表是线性的,每个设置都由一个记录表示。所有类型的设置(stringintbool)都以字符串形式存储在 Value 字段中,这与 web.config 中所有设置都以字符串形式存储的方式非常相似。设置的存储和检索是通过一组简单的存储过程完成的。创建表和存储过程的脚本包含在源文件中。

编辑设置

设置使用源代码中提供的 Web 用户控件 AppSettings.ascx 进行编辑。该控件有两种模式:“编辑模式”和“配置模式”。您可以通过单击表单上的按钮在模式之间切换。在编辑模式下,您可以按类别浏览设置并编辑设置的值。在配置模式下,您可以添加、编辑和删除类别;并在每个类别下,您可以添加、编辑和删除设置。配置设置时,您可以指定设置类型、如果设置是文本类型,编辑器应显示的行数,以及可选的选择列表。在编辑时,设置的描述会显示在编辑框旁边,以帮助编辑该值的人正确填写。编辑器根据设置的类型呈现不同的形式。文本设置使用文本框。布尔设置使用“真/假”单选按钮选择器。整数设置使用小的文本框。如果您指定了选择列表,编辑器将使用组合框,编辑者可以从中进行选择。

下图显示了处于空闲状态、配置模式和编辑模式下的编辑器。

Application settings

应用程序设置

Configure application settings

配置应用程序设置

Edit application settings

编辑应用程序设置

编辑器代码

编辑器代码并不太有趣。它只是大量处理显示和隐藏 UI 元素以尝试创建良好的用户体验。我不会在此详细介绍。

请注意,在编辑器底部有一个“加载设置到应用程序”按钮。由于应用程序设置通常只在应用程序启动时加载,因此有必要提供此按钮,以便在编辑并保存到数据库后重新加载它们。下一节将详细介绍应用程序设置的加载。

加载应用程序设置

应用程序设置的加载由代码中名为 AppSettings 的类管理。以下是 AppSettings 代码的列表。

 /// <summary>

 /// A list of the application settings

 /// </summary>

 public class AppSettings : Hashtable
 {
  public AppSettings()
  {
   SqlDataReader dr = ExClassLib.Sql.SPHelper.ExecuteReader( 
      ConfigurationSettings.AppSettings["ConnectionString"], 
      CommandType.StoredProcedure, "Fx_AppSettings_GetAll" );
   while( dr.Read() )
   {
    string key = ( (string)dr["Category"] ).ToUpper() + "." + 
      ( (string)dr["Name"] ).ToUpper();
    string value = (string)dr["Value"];
    Add( key, value );
   }
   dr.Close();
  }

  public string this[string name]
  {
   get
   {
    string key = name.Trim().ToUpper();
    if( base[key] == null )
    {
     HttpContext.Current.Response.Redirect( 
       "~/AppSettings.aspx?BadAppSetting=" + name );
     return null;
    }
    else
     return (string)base[key];
   }
   set
   {
    base[name] = value;
   }
  }
 }

如您所见,构造函数只是通过用于此目的的存储过程从表中获取设置列表,并将它们放入一个 HashTable 中。HashTable 的键是通过句点分隔的设置类别和设置名称。我们稍后将使用它来检索应用程序设置。

另一个方法是“this”索引属性,它为我们提供了一个方便的语法来引用属性。另请注意,在此属性的代码中,有一个检查以确定属性是否存在。如果属性不存在,应用程序将重定向到 AppSettings.aspx,并将缺失的设置通过 URL 发送。我们稍后将看到这如何有助于确保应用程序拥有所有必需的设置。

使用应用程序设置

要使用应用程序设置,您需要创建 AppSettings 的实例并将其存储在可以全局引用的位置。在 Exia Corp.,我们将其存储在我们的 Framework 类中。您可以将其放在 Global 或您拥有的其他全局类中。AppSettings 类只需要为应用程序实例化一次,因此请确保您在 Application_Start 事件中创建它,而不是在每个请求中创建。

接下来,您只需使用以下语法引用应用程序设置:

string xyz = myGlobalClass.AppSettings[ "category.name" ];

帮助程序方法:您可能希望在全局类中编写三个帮助程序方法,以便您可以在不进行类型转换的情况下引用应用程序设置。以下是 AppSettingBool 方法的代码,您可以将其放在包含 AppSettings 的全局类中。

  public static bool AppSettingBool( string name )
  {
   if( AppSettings[name] == null )
    return false;
   else
    return AppSettings[name].ToUpper() == "TRUE";
  }

现在您可以编写如下代码:

bool abc = myGlobalClass.AppSettingBool( "category.name" );

... 这可以节省大量时间。

源代码中包含了用于 AppSettingAppSettingInt 的类似方法。

处理丢失的应用程序设置

丢失或错误的应用程序设置是一个问题。当必需的应用程序设置丢失且应用程序无法运行时会发生什么?现在您无法运行应用程序,因此无法进入应用程序编辑器来修复该设置。嗯,您总是可以打开表并手动调整设置,但这很麻烦。您需要一个独立的表单,您知道您可以随时打开以调整应用程序设置。此表单在源代码中提供为 AppSettings.aspx。该表单的目的是容纳 AppSettings.ascx 控件,该控件用于编辑设置。

现在,回过头来看看 AppSettings 类代码列表。请记住,我们提到检索应用程序设置的代码会检查设置是否存在。如果设置不存在,则该类被硬编码为打开此表单。这样,如果您在设置上犯了错误、忘记了一个设置或拼错了一个设置,该表单将立即打开,以便您调整设置。

[将中间层类硬编码为调用表单是个好主意吗?可能不是,但在 Exia Framework 中,我们非常确信 AppSettings 表单将始终存在,因此我们接受了这一点。更好的方法是重构 AppSettings 类,以便在遇到错误设置时引发事件,并在 UI 层中捕获该事件。]

如果您手动打开表单,它将显示编辑器。但是,如果它由系统打开,则会传递一个带有错误设置名称的参数,并且表单会向您显示一个漂亮的解释性错误消息,如下所示。

Sample screenshot

应用程序设置编辑器(错误模式)

您需要进行的调整

在我们的商店中,我们使用修改版的 Microsoft Data Access Block 来调用存储过程。您需要进行一些小的代码调整,以使此代码适合您自己的存储过程调用方法。

完整的示例应用程序

提供的源代码包含设置应用程序设置管理器所需的一切。但是,它需要一些调整。对于那些希望在不进行调整的情况下使用它的人,可以在 此处 免费下载完整版本,它已嵌入 Exia Web Solution Framework 中。

保护应用程序设置

保护设置的最简单方法是不要向您的最终用户授予编辑器表单的访问权限,或者只授予管理员访问权限。

如果您需要更精细的安全控制,例如,如果您想让某些组管理某些设置,而让其他组管理其他设置,那么您可能需要考虑基于 GUID 的安全方案,例如我们 Exia Fx 框架中的方案。这种方案使您能够保护任何可以附加 GUID 的内容,因此您可以从组级别或个人设置级别保护设置。

结论

本文介绍了一个简单易用的应用程序设置管理器,以及一个允许您或您的客户轻松编辑设置的用户界面。此外,该界面使您能够轻松地配置设置、将它们组织到组中,并附加在编辑时有用的描述。有了这个系统,您可以清理 web.config 文件中的大量垃圾,同时更轻松地控制您的应用程序设置。

© . All rights reserved.