EnterpriseLibrary的DAAB如何灵活配置数据库的笔记

简介:
hi,all,
项目中常常用到EnterpriseLIbrary2006Jan库中的DAAB,所以经常需要用PPT给员工说明一下DAAB配置文件中如何配置数据库连接字符串的。下面就是一些简单的文字描述:
 
第一小节:
什么是节处理器 (Section Handlers)

在配置文件里除了 常见的system.net、system.data等节点之外, 还可以自已写 XML 格式的配置元素,这些元素叫做节(Section)。当然,如果你自己写一堆复杂的 XML 格式的标签,.NET 自身是不知道如何解析的,因此这里就需要你在指定节的同时,告诉 .NET 如何处理它们,也就是定义“节处理器”(Section Handlers)。

每一个自定义的节,都需要在 configSections 下面定义它们的节处理器。先来看一个例子:

<?xml version="1.0" encoding="utf-8" ?>

 <configuration>

 <configSections>

       <section name="dataConfiguration"type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,Microsoft.Practices.EnterpriseLibrary.Data, Version= 2.0.0 .0, Culture=neutral, PublicKeyToken=null" />

  </configSections>

 

这就是定义说,如果发现在配置文件有“dataConfiguration”节点,那么就应该用assembly“Microsoft.Practices.EnterpriseLibrary.Data”的“Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings”类来处理。

 

第二小节,

为什么它能处理?

我们来看dataConfiguration节点中都定义了什么:

<dataConfiguration defaultDatabase="USP_Authentication">

 <providerMappings>

  <add databaseType="Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version= 2.0.0 .0, Culture=neutral, PublicKeyToken=null" name="Data.Usp.mssql" />

  </providerMappings>

  </dataConfiguration>

它包含了两个东西:

属性:defaultDatabase

和节点:providerMappings

,如果DAAB写程序读取配置,需要处理这两个东西。

 

接下来我们打开Enterprise library 2006.Jan的Data solution,看看Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings是怎么定义的。

 /// <remarks>
 /// <para>The class maps to the <c>databaseSettings</c> element in configuration.</para>
 /// </remarks>
 public class DatabaseSettings : SerializableConfigurationSection


Enterprise Library 的配置框架建立在 System.Configuration 的基础之上,而且工作方式也与其非常相似。应用程序块的配置节派生自 Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SerializableConfigurationSection,而不是直接从 System.Configuration.ConfigurationSection 派生。
SerializableConfigurationSection 也是Microsoft.Practices.EnterpriseLibrary.Common.Configuration下的类,是从ConfigurationSection, IXmlSerializable类继承可以看出是对ConfigurationSection的扩展,而每个EntLib应用程序块的配置节点都必须继承自此类,此类主要包括了对XML文件节点的操作方法。

{
  private const string defaultDatabaseProperty = "defaultDatabase";
  private const string dbProviderMappingsProperty = "providerMappings";

  /// <summary>
  /// The name of the data configuration section.
  /// </summary>
  public const string SectionName = "dataConfiguration";

最重要的代码是:

public static DatabaseSettings GetDatabaseSettings(IConfigurationSource configurationSource)
  {
   return (DatabaseSettings)configurationSource.GetSection(SectionName);
  }

它的意义就是,从配置文件中指定dataConfiguration名的节点树把配置读取到ConfigurationSection对象中。

之后就可以:

对于属性,它这么处理:

[ConfigurationProperty(defaultDatabaseProperty, IsRequired = false)]
  public string DefaultDatabase
  {
   get
   {
    return (string)this[defaultDatabaseProperty];
   }
   set
   {
    this[defaultDatabaseProperty] = value;
   }
  }

对于节点,它这么处理:

[ConfigurationProperty(dbProviderMappingsProperty, IsRequired = false)]
  public NamedElementCollection<DbProviderMapping> ProviderMappings
  {
   get
   {
    return (NamedElementCollection<DbProviderMapping>)base[dbProviderMappingsProperty];
   }
  }

示意如下:

第三步,

配置节点详解

我们在配置文件中用

<system.data>
    <DbProviderFactories>
      <add 
    name="Sql Server 2005" 
    invariant="Data.Usp.mssql
    description="An alias for the SqlProvider" 
    type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </DbProviderFactories>
  </system.data>

设定了database的provider,在这里可以指定很多种不同的provider,比如:

<system.data>
    <DbProviderFactories>
      <add name="my Generic Database" invariant="MyOleDBDatabase" description="An alias for the OleDBProvider" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </DbProviderFactories>
  </system.data>

此时要用自己定义的provider,就可以这么定义连接字符串:

<connectionStrings>
    <add name="MyTestConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\My2005Codes\TestCode\AccessDB.mdb;"
      providerName="MyOleDBDatabase" />
  </connectionStrings>

当然,也可以不用在这里指定,而是后面连接字符串配置节点中直接指定已有的provider。

我们现在的连接字符串配置是:

<connectionStrings>
    <add 
    name="Authentication" 
    providerName="System.Data.SqlClient"
    connectionString="Server=11.168.1.22;database=DB_Authentication;UID=usp;PWD=de;" />

    <add 
    name="Log" 
    providerName="Data.Usp.mssql"
    connectionString="Server=11.168.1.22;DataBase=DB_Log;UID=logger;PWD=de;" />
    
  </connectionStrings>

那么,实际上这个“System.Data.SqlClient”就是系统约定的provider名,用我们自定义的“Data.Usp.mssql”也可以达到同样的效果。

第四步,

当我们调用

DatabaseFactory.CreateDatabase("Authentication");

时,实际上就是命令DAAB用
<add 
    name="Authentication" 
    providerName="System.Data.SqlClient"
    connectionString="Server=11.168.1.22;database=DB_Authentication;UID=usp;PWD=de;" />

所指定的连接字符串去连数据库。

 

辅助参考蝈蝈俊的blog:

DatabaseFactory.CreateDatabase 方法创建数据库实例的 逻辑过程

简单看一下  DatabaseFactory.CreateDatabase 方法 是根据啥关系,来判断应该创建的是 Database 抽象类的那个子类。

分析代码可知,这里的判断分三步:
主要代码看 DatabaseCustomFactory.cs 文件的 
public object CreateObject(IBuilderContext context, string name, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)方法。

第一步:
在链接字符串中,我们可以根据链接字符串的 name 获得 链接字符串的 providerName 。

第二步: 
如果 我们设置了 providerName 的任何 影射关系, 则自动获得 这个映射的 DbProviderMapping ;
如果这个数据库访问者 没有被设置任何影射关系, 则 系统自动在默认提供的 SqlDatabase、 OracleDatabase 中匹配。
如果上述都没匹配出结果, 则 返回 GenericDatabase 。

上述逻辑在 DatabaseConfigurationView.cs 文件中可以看到代码:


public DbProviderMapping GetProviderMapping(string name, string dbProviderName)
{
 DatabaseSettings settings = this.DatabaseSettings;
 if (settings != null)
 {
  DbProviderMapping existingMapping = settings.ProviderMappings.Get(dbProviderName);
  if (existingMapping != null)
  {
   return existingMapping;
  }
 }

 DbProviderMapping defaultMapping = this.GetDefaultMapping(name, dbProviderName);
 if (defaultMapping != null)
 {
  return defaultMapping;
 }

 return this.GetGenericMapping();
}

第三步
根据 DbProviderMapping 生成 Database 抽象类的实例。

根据上述逻辑描述,我们就可以理解如下一个数据库的配置文件了。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </configSections>

  <dataConfiguration defaultDatabase="MyTestConnectionString">
    <providerMappings>
      <add databaseType="Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name="GenericDatabase" />
      <add databaseType="Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name="System.Data.SqlClient" />
    </providerMappings>
  </dataConfiguration>

  <connectionStrings>
    <add name="MyTestConnectionString" connectionString="server=(local)\SQLEXPRESS;database=EntLibQuickStarts;Integrated Security=true;"
      providerName="GenericDatabase" />
  </connectionStrings>

  <system.data>
    <DbProviderFactories>
      <add name="my Generic Database" invariant="GenericDatabase" description="An alias for the SqlProvider" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </DbProviderFactories>
  </system.data>

</configuration>

这个数据库配置文件生成的  Database dbSvc = DatabaseFactory.CreateDatabase(); 
dbSvc 必然是 Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase 类型的。

注意:  
system.data 数据节 的 DbProviderFactories 配置节 是给配置文件中 connectionStrings 节的 providerName 对应用的。
而 dataConfiguration 配置节的 providerMappings 是给 生成 的 是那一个 Database 抽象类的那一个实例用的。

参考资料:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/entlibjan2006_dataaccessappblock.asp
http://blogs.msdn.com/tomholl/archive/2005/09/14/466298.aspx
http://www.dotnetslackers.com/VB_NET/re-9165_DAAB_in_Enterprise_Library_for_NET_2_0.aspx

郑昀 笔记  200703

 

推荐阅读:

从美国单身男女的分布图说起--纵论视觉化叙述 (3-1 20:54)

[职场生存]细节和感觉[]:感觉 (1-28 23:16)

[职场生存]细节和感觉[]:细节包括哪些部分? (1-28 23:15)

[职场生存]细节和感觉[] (1-25 21:09)

郑昀邀请C#架构师加盟易通无线[工作地点-北京财智国际大厦(3-5 14:58)

目录
相关文章
|
10天前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
178 93
|
3月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
137 1
|
10天前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
147 7
|
10天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
162 4
|
6月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
5月前
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
3月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
286 3
Jasypt加密数据库配置信息
|
2月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
262 0
|
5月前
|
Java 关系型数据库 MySQL
JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用
以上就是JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用的基本步骤。这些步骤可能会因为你的具体需求和环境而有所不同,但是基本的思路是一样的。希望这些信息能够帮助你更好地理解和使用这些工具。
185 17
|
5月前
|
Oracle 关系型数据库 Linux
YashanDB异构数据库链接配置
本指南介绍在YashanDB中配置异构数据库链接(DBLINK)的方法,特别是连接至Oracle数据库的前置要求与步骤。需确保YashanDB服务端安装plugin插件包、Oracle Instant Client及libaio库,否则可能导致错误或进程崩溃。文档还提供了Oracle Instant Client和libaio库的具体安装指导,帮助管理员顺利完成配置。