Data Access Application Block包含如下特性:
- 简单且有效的方式访问通用数据库。
- 透明支持多数据库类型的开发。
- 映射逻辑数据库实例名和物理连接。
- 方便地调整和验证数据库配置设置。
类设计视图
下图来自Enterprise Library文档,描述了DAAB中主要类之间的关系:
抽象类Database定义了通用接口并提供了大量数据访问方法的实现,SqlDatabase, OracleDatabase和Db2Database类均继承Database类,它们分别对各自的数据库服务系统提供了方法,包括不同数据库系统的通用功能和特定数据库系统的特有功能。
不同数据库系统之间数据库命令和参数处理方式不一样,抽象类DBCommandWrapper为特定的数据库类提供了接口定义,包装IDBComand接口并提供参数处理。
DatabaseFactory类提供了静态方法CreateDatabase,用来封装创建Database对象的逻辑。通过使用该工厂方法创建正确的Database对象,客户端代码并没有绑定到特定的数据库类型。DatabaseFactory类使用Configuration Application Block检索必要的配置信息,包括要创建的特定Database继承类的类型名称和连接字符串。
DAAB支持参数的动态发现,该发现机制需要一个到数据库系统的往返(roundtrip)。ParameterCache类允许缓存参数信息,这样可以避免随后对相同存储过程调用的往返,因此参数信息已经在缓存中。
简化数据访问
Application Block提供了少量的接口来简化大多数通用的数据访问任务。它提供了一个抽象基类Database,该基类如下一组方法:
- ExecuteDataSet
- LoadDataSet
- ExecuteReader
- ExecuteScalar
- ExecuteNonQuery
- UpdateDataSet
上述每一个方法都有大量的重载,这些重载允许对每一个方法的传递信息进行不同程度的控制,并且接受不同的编程风格。其中一个重载方法允许你传递DBCommandWrapper类型的对象,抽象基类DBCommandWrapper同时封装命令和参数处理到一个单一对象。意味着Database类的方法仅需要DBCommandWrapper对象为唯一参数,如下code snippet所示:
DBCommandWrapper dbCommandWrapper = db.GetStoredProcCommandWrapper("GetProductsByCategory");
dbCommandWrapper.AddInParameter("@CategoryID", DbType.Int32, 2);
DataSet productsDataSet = db.ExecuteDataSet(dbCommandWrapper);
同时,Application Block封装了对数据库连接的生存期管理,简化开发人员的工作量和代码。
数据库透明和数据库逻辑命名
抽象Database类提供了大量的数据方法方法,并且隔离特定数据库相关的特性,如ExecuteXmlReader方法只有SqlDatabase类提供。因为DatabaseFactory返回Database类型对象,client端代码必须转换到特定数据库类型,如下code snippet所示:
SqlDatabase dbSQL = (SqlDatabase)
DatabaseFactory.CreateDatabase("EntLibQuickStartsSql");
...
XmlReader xmlResults = dbSQL.ExecuteXmlReader(dbCommandWrapper);
DAAB支持开发人员通过逻辑名称来引用他们的目标数据库,如Customers和Inventory。所有的DAAB方法都不接受数据库连接信息,但是CreateDatabase方法接受包括逻辑名称的字符串。工厂使用逻辑名称来定位合适的数据库类型和配置文件中连接信息,如下code snippet所示:
Database db = DatabaseFactory.CreateDatabase("Customers");
逻辑命名允许开发人员在代码中引用多个数据库实例,甚至异构的数据库类型。
***
作者:Rickie Lee (rickieleemail#yahoo.com)
本文参考/翻译Microsoft patterns & practices Enterprise Library, DAAB section文档,如下References还提供相关文档的链接。