hao_2468

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
项目中常常用到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;" />

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

 

 

posted on 2011-04-25 11:49  hao_2468  阅读(234)  评论(0编辑  收藏  举报