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

使用反射和自定义 Web 配置段动态数据访问

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (6投票s)

2005 年 11 月 8 日

5分钟阅读

viewsIcon

50972

downloadIcon

642

本文演示了:i) 在 web.config 文件中创建自定义分区 ii) 创建自定义分区处理器 iii) 使用反射动态加载数据访问库。

引言

假设你正在构建一个需要从未知数据源获取数据的应用程序,这些数据源可能有一个或多个,并且有独立的组件来连接每个数据源。如果你想实现即插即用功能,即你只需在 web.config 文件中配置一个数据访问组件,然后将其复制到 Web 服务器上,你的应用程序就能开始从新的数据源获取数据,只要该组件存在于 Web 服务器上。

在本演示中,我们将使用反射和自定义分区处理来处理这种情况。

本文档演示了以下内容

  1. web.config 文件中创建自定义分区。
  2. 创建自定义分区处理器。
  3. 使用反射动态加载数据访问库。

在开始之前,让我们熟悉一下本文将使用的一些关键字。

什么是 web.config 文件中的自定义分区?

通常,如果我们想存储应用程序的可配置信息,我们会将其存储在 web.config 文件中的 <AppSettings> 分区中。自定义分区是更结构化地在 web.config 文件中存储自定义可配置数据的方式。我们定义自己的自定义标签并创建自定义处理器来处理数据。

什么是自定义分区处理器?

自定义分区处理器是一个对象,用于从 XML 配置文件中的自定义分区获取和操作数据。它通常以对象集合的形式返回存储在自定义分区中的数据。借助自定义分区处理器,你可以获得配置设置的智能感知。

平台

此应用程序使用 .NET Framework 1.1 在 Visual Studio 2003 中开发。

解决方案

为了实现上述目标,我们将创建一个示例 Web 应用程序。该应用程序将在运行时从任何即插即用的数据源获取数据。获取的数据将填充到数据网格中。为此,我们将遵循以下步骤

  1. 与数据访问组件相关的信息将存储在 web.config 文件的自定义分区中。
  2. 应用程序将使用自定义分区处理器从自定义分区读取数据。
  3. 反射将用于在运行时加载数据访问组件,并将调用适当的方法来填充数据。

进程

数据访问组件

演示应用程序包含两个示例数据访问组件。一个连接到 SQL Server (SQLConnect);另一个连接到本地 XML 文件 (XMLConnect)。这两个组件都将实现一个公共接口 IDBConnect

web.config 中的自定义分区

下面是如何在 web.config 文件中定义自定义分区的示例

<configSections>
 <sectionGroup name="DS">
   <section name="VariousDataSources" 
      type="CustomConfigHandler.DBSourceHandler, CustomConfigHandler "/>
 </sectionGroup>
</configSections>

注意:你必须将自定义分区声明为 web.config 文件中 configuration 元素下的第一个子元素。

还要注意,你必须给出自定义分区处理器的名称,并提及带有命名空间的类的完整名称。当你调用 Configuration.GetConfig() 方法时,将激活此类。

定义自定义分区后,你将按以下方式实际存储数据

<DS>
   <VariousDataSources TotalCount="2">
       <DataSources>
            <Clear/>
            <DataSource IsActive="true">
               <AssemblyName>DBConnector_SQL.dll</AssemblyName>
               <AssemblyTypeName> DBConnector_SQL.SQLConnect</AssemblyTypeName>
               <ConnectionStr>Provider=SQLOLEDB;Data Source=pc-p41400;
                     Initial Catalog= Northwind;UserId=sa;Password=;</ConnectionStr>
            </DataSource>
            <DataSource IsActive="true">
               <AssemblyName> DBConnector_XML.dll</AssemblyName>
               <AssemblyTypeName> DBConnector_XML.XMLConnect</AssemblyTypeName>
               <ConnectionStr>C:\RData.Xml</ConnectionStr>
            </DataSource>
         </DataSources>
    </VariousDataSources>
</DS>

自定义分区处理器

自定义分区处理器必须实现 IconfigurationSectionHandler 接口。下面是自定义分区处理器的声明

public class DBSourceHandler : IConfigurationSectionHandler

它必须实现以下方法

public Object Create(object parent, object context, XmlNode node){}

Create 方法将数据从自定义分区加载到基于集合的对象中。调用 Configuration.GetConfig() 时将返回该对象。

在运行时加载对象

以下代码片段将在运行时加载数据访问库

Assemblyassembly = Assembly.LoadFrom(completePath);

参数 completePath 是要加载的程序集的路径。示例应用程序假定要加载的程序集应存在于应用程序的 bin 文件夹中。

使用示例应用程序

DBConnector_SQL 组件从 Northwind 数据库检索数据。因此,如果你想使用此组件检索数据,则需要在自定义分区中的以下节点中配置连接字符串

<DataSource IsActive="true">
   <AssemblyName>DBConnector2.dll</AssemblyName>
   <AssemblyTypeName>DBConnector2.SQLConnect</AssemblyTypeName>
   <ConnectionStr>Provider=SQLOLEDB;Data Source=pc-p41400;
           Initial Catalog=Northwind;User Id=sa;Password=;</ConnectionStr>
</DataSource>

DBConnector_XML 组件从 XML 文件检索数据。示例文件可与示例代码一起下载。要配置 XMLConnect,你需要更改下载 XML 文件的路径。对于 DBConnector_XMLConnectionStr 节点存储 XML 文件的路径。

<DataSource IsActive="true">
   <AssemblyName>DBConnector1.dll</AssemblyName>
   <AssemblyTypeName>DBConnector1.XMLConnect</AssemblyTypeName>
   <ConnectionStr>C:\RData.Xml</ConnectionStr>
</DataSource>

如果你希望禁用其中任何一个组件,只需将 IsActive 属性设置为 false

如果你希望添加自己的数据访问组件,只需追加 DataSource 节点。假设你的组件的文件名为“MyComponentName.dll”,类型名称为 MyTypeName,则应按如下方式追加自定义分区

<DataSource IsActive="true">
   <AssemblyName>MyComponentName.dll</AssemblyName>
   <AssemblyTypeName>MyNameSpace.MyTypeName</AssemblyTypeName>
   <ConnectionStr>MyConnectionString</ConnectionStr>
</DataSource>

注意:加载 Web 网格数据的测试应用程序假定所有组件返回的查询数据模式都相同。因此,如果你希望添加自己的组件,它必须返回 EmployeeIdLastNameFirstName 列。

示例 Web 应用程序

下面是示例 Web 应用程序的屏幕截图

Dynamic Data Access

开发过程中遇到的错误

以下是在开发过程中遇到的一些错误

  • 无法加载文件或程序集“file:///C:\WINNT\system32\DBConnector2.dll”或其依赖项之一

    当你尝试使用 Assembly.Load 方法在运行时加载组件时,会出现此错误。我通过使用 Assembly.Load(path) 并提供要加载的程序集的完整路径来解决此错误。

  • 提供的程序集名称或代码库无效(来自 HRESULT 的异常:0x80131047)

    此错误发生在我的自定义分区处理器编写不正确时。当我重写自定义分区处理器时,错误消失了。

摘要

  • 自定义分区是 web.config 文件中用户定义的 असतात。
  • 自定义分区需要自定义分区处理器。
  • 你可以这样设计你的应用程序,以便为你的数据访问组件提供即插即用功能。

参考文献

© . All rights reserved.