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






4.27/5 (6投票s)
2005 年 11 月 8 日
5分钟阅读

50972

642
本文演示了:i) 在 web.config 文件中创建自定义分区 ii) 创建自定义分区处理器 iii) 使用反射动态加载数据访问库。
引言
假设你正在构建一个需要从未知数据源获取数据的应用程序,这些数据源可能有一个或多个,并且有独立的组件来连接每个数据源。如果你想实现即插即用功能,即你只需在 web.config 文件中配置一个数据访问组件,然后将其复制到 Web 服务器上,你的应用程序就能开始从新的数据源获取数据,只要该组件存在于 Web 服务器上。
在本演示中,我们将使用反射和自定义分区处理来处理这种情况。
本文档演示了以下内容
- 在 web.config 文件中创建自定义分区。
- 创建自定义分区处理器。
- 使用反射动态加载数据访问库。
在开始之前,让我们熟悉一下本文将使用的一些关键字。
什么是 web.config 文件中的自定义分区?
通常,如果我们想存储应用程序的可配置信息,我们会将其存储在 web.config 文件中的 <AppSettings>
分区中。自定义分区是更结构化地在 web.config 文件中存储自定义可配置数据的方式。我们定义自己的自定义标签并创建自定义处理器来处理数据。
什么是自定义分区处理器?
自定义分区处理器是一个对象,用于从 XML 配置文件中的自定义分区获取和操作数据。它通常以对象集合的形式返回存储在自定义分区中的数据。借助自定义分区处理器,你可以获得配置设置的智能感知。
平台
此应用程序使用 .NET Framework 1.1 在 Visual Studio 2003 中开发。
解决方案
为了实现上述目标,我们将创建一个示例 Web 应用程序。该应用程序将在运行时从任何即插即用的数据源获取数据。获取的数据将填充到数据网格中。为此,我们将遵循以下步骤
- 与数据访问组件相关的信息将存储在 web.config 文件的自定义分区中。
- 应用程序将使用自定义分区处理器从自定义分区读取数据。
- 反射将用于在运行时加载数据访问组件,并将调用适当的方法来填充数据。
进程
数据访问组件
演示应用程序包含两个示例数据访问组件。一个连接到 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_XML
,ConnectionStr
节点存储 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 网格数据的测试应用程序假定所有组件返回的查询数据模式都相同。因此,如果你希望添加自己的组件,它必须返回 EmployeeId
、LastName
和 FirstName
列。
示例 Web 应用程序
下面是示例 Web 应用程序的屏幕截图
开发过程中遇到的错误
以下是在开发过程中遇到的一些错误
- 无法加载文件或程序集“file:///C:\WINNT\system32\DBConnector2.dll”或其依赖项之一
当你尝试使用
Assembly.Load
方法在运行时加载组件时,会出现此错误。我通过使用Assembly.Load(path)
并提供要加载的程序集的完整路径来解决此错误。 - 提供的程序集名称或代码库无效(来自 HRESULT 的异常:0x80131047)
此错误发生在我的自定义分区处理器编写不正确时。当我重写自定义分区处理器时,错误消失了。
摘要
- 自定义分区是 web.config 文件中用户定义的 असतात。
- 自定义分区需要自定义分区处理器。
- 你可以这样设计你的应用程序,以便为你的数据访问组件提供即插即用功能。