在数据访问应用程序块的初始状态中,它可以很好的工作于典型的数据访问场景中。然而,可能许多时候你需要定制应用程序块的某些行为以更好的适应你的应用程序的需求。在此有二种方法来完成它:扩展和修改。
扩展数据访问应用程序块
可以通过设计的扩展点来扩展应用程序块。典型的,必须编写定制的类。定制的类必须实现特定的接口或者派生自抽象类。因为这些定制的类存在于应用程序的空间里,所有不需要修改或重新构建应用程序块。而是使用配置设置来指明扩展。
现在,可以通过添加新的 database 类型来扩展应用程序块。如果应用程序需要来自一种不同于 SQL Server 或者 Oracle 数据库的数据库的特定特性。只有在如果应用程序块的 GenericDatabase 类和用于数据库系统的 ADO.NET 数据提供程序没有提供需要的特性时才奇妙扩展应用程序块。例如, GenericDatabase 对象不支持用于存储过程的特殊参数前缀或者调用没有在 DbCommand 类或者 DbConnection 类中的方法。另外 GenericDatabase 类不支持参数发现。
可 以通过创建支持没有由 ADO.NET 数据提供程序暴露的特性的新的数据库类来扩展应用程序块。例如,你的数据库类可以支持参数发现。也可以扩展应用程序块以允许客户代码通过类型转换或者管理 SQL 语法转换来保持数据库透明。构建定制的数据库类允许应用程序支持整个数据访问应用程序块 API 集合以及与其他数据库语法的更好的一致。要学习更多,请参见添加新的应用程序块数据库提供程序。
修改应用程序块
可以通过修改应用程序块的源码来修改应用程序块。这可能需要也可能不需要相应配置改变。因为改变是作用于源代码的,在修改起作用之前必须重新构建应用程序块。还必须准备处理支持和版本问题。要学习更多,请参见修改数据访问应用程序块。
6.1 - 添加新的应用程序块数据库提供程序
如果使用的关系数据库系统没有一个应用程序块数据库提供程序,就可以自己创建一个。只有在应用程序块的 GenericDatabase 类无法满足应用程序的需求时才有此必要。(这假定已有用于使用的数据库系统的 ADO.NET 2.0 DbProviderFactory 类型。)要创建一个新的数据库提供程序,必须创建一个派生自 Database 类的新的数据库类。另外,如果想要客户代码保持数据库透明,可能不得不编写用于完成如类型转换这样的任务的附加代码。创建新的数据库类
完成创建新的数据库类
1. 创建一个派生自
Database 类的新类。
2. 实现允许应用程序块用连接字符串和任何其他的如用于 Oracle 数据库的包映射的信息来实例化数据库类的构建函数。
C#
public SqlDatabase(string connectionString) : this(connectionString, SqlClientFactory.Instance)
{
}
Visual Basic
Private Function SqlDatabase(ByVal connectionString As String) As Public : Me(connectionString, SqlClientFactory.Instance)
End Function
注意:
Database 基类提供了必要的使用连接字符串和
DbProviderFactory 初始化类的实现。
3. 如果需要,重载用于参数处理的方法。例如,重载
DeriveParameters 方法以支持参数发现。还可以重载下列方法:
UserParametersStartIndex。当命令中的存储过程参数的开始索引不为零是重载此方法。例如,每个 SQL Server 数据库的存储过程有一个返回值参数(无论是否显式使用),它是除其他存储过程参数以外的参数。此参数是在 ADO.NET
DbCommand 对象的
Parameters 集合中的第一个参数(起始索引为零)。因此,
SqlDatabase 类重载了
UserParametersStartIndex 方法以返回一个 1 做为起始索引。这样,索引影响了第一个存储过程参数的位置,同时有效的跳过了返回值参数。
BuildParameterName。 重载此方法以确保合适的参数名称用于存储过程的调用。重载此参数允许客户代码传递无特定数据库标记的参数名称。例如,SqlDatabase 类重载此参数以确保所有参数都以“@”字符开始。因此,客户代码可以传递无“@”字符的参数名称,以允许客户代码保持数据库透明。
SameNumberOfParametersAndValues。重载此方法以比较在
DbCommand 对象中参数的数量和在数组中参数的数量。例如,用于 SQL Server 数据库的参数数组包含有返回值参数。SQL 为每个存储过程调用生成此参数,但它没有包含在
DbCommand 对象的数量中。
SqlDatabase 类重载
SameNumberOfParametersAndValues 方法以完成命令参数数量和参数值数量的适当比较。
4. 添加专用于提供程序的功能。例如,
SqlDatabase 类提供了
ExecuteXmlReader 方法。这将不得不向下转换到自己的数据库提供程序类类型以访问任何定制的方法。还可以重载其他方法以适配它们的行为以适应自己的情况。例如,可以在传递 SQL 命令到 ADO.NET 类之前修改它的语法。
配置应用程序以使用新的提供程序
在完成新的提供程序后,必须配置应用程序以使用它。对于配置应用程序使用定制提供程序的介绍,请参见输入配置信息。
用于创建数据库提供程序的建议
下面是一些用于创建和测试数据库提供程序的指南:
- 只有在用于要创建的数据库类型的 ADO.NET DbProviderFactory 子类已存在时才能创建新的数据库类型。
- 使用已存在的数据库提供程序做为自己的模型。使用数据访问应用程序块自带的 SQL Server 或者 Oracle 数据提供程序做为自己的提供程序的基础。
- 使用包含在数据访问应用程序块程序集中的单元测试验证提供程序的工作。
- 确定测试了数据类型转换,以及文档化了提供程序不同的不支持或支持的东西。此文档将有助于构建可移植数据库应用程序的开发人员。
6.2 - 修改数据访问应用程序块
数据访问应用程序块为用于各种应用程序而设计。使用它的扩展点,可以适配应用程序块以适应特定应用程序的需要。然而,如果要添加新的特性到应用程序块中,就可以通过修改源代码来进行(应用程序块自带了源码和二进制)。如果决定要修改源代码,请按照此节中的建议进行。用于修改数据访问应用程序块的建议
在修改源代码时,请遵照这些最佳实践:
- 通过阅读此文档中的设计节,确定已理解应用程序块是如何工作的。
- 强烈建议如果大量修改了代码或者如果将应用程序块的定制版本一起使用时修改数据访问应用程序块的命名空间。要注意的是,修改应用程序块的命名空间将需要修改所有使用数据访问应用程序块的其他应用程序块和应用程序的命名空间。
- 使用强名称。强命名程序集可以唯一的标识、版本和进行完整性检查。将不得不生成自己的密钥对以签名应用程序块的修改版本。更多信息,请参见 Strong Named Assemblies 和 Versioning Tutorial。另一种方法是不签名定制版本,这叫做弱名称。
- 为了使修改起作用,必须重新编译代码。打开数据访问应用块 Visual Studio 解决方案文件,然后重建整个解决方案。
- 使用与数据访问应用程序块一起的单元测试为基础进行自己的单元测试。尽早的、经常测试代码。