zoukankan      html  css  js  c++  java
  • 用配置约定适配过程

    相对前面的工厂、创建者模式而言,适配器模式的变化主要体现在Adapter类型上,因为对客户程序而言,它需要的抽象接口ITarget是固定 的,您只须告诉它用哪个实现了ITarget的类型即可,额外的可能需要把Adapter的一些执行参数配置上去即可。我们看一个现成的例子:.NET Framework中关于Data Provider的设置。

    首先,在Machine.Config中有个名为<system.data>的ConfigurationSection,它的下面有 一个名为<DbProviderFactories>的节点(ConfigurationElemeentCollection),它登记了 每个DbProvider的逻辑名称和具体的Qualified名称,其代码如下:

    Machine.Config
    <configuration>
    <configSections>
    <section name="system.data" type=" "/>
    </configSections>
    <system.data>
    <DbProviderFactories>
    <add name="SqlClient Data Provider"invariant=" " description="."type=" "/>
    … …
    </DbProviderFactories>
    </system.data>
    </configuration>

    然后,我们在应用中选择需要的DbProvider,这其实相当于选择适合某个特定数据库的一组符合DbConnection、 DbDataAdapter、DbCommand、DbTransaction……要求的Adapter类型,由于它们是"一系列相关或具有依赖关系 的",所以没有直接返回具体的SqlConnection、SqlCommand,而是返回了一个抽象工厂,由这个工厂加工具体的适配器,其代码如下。

    App.Config
    <configuration>
    <connectionStrings>
    <add name="sales" providerName="System.Data.SqlClient" connectionString= "" />
    </connectionStrings>
    </configuration>
    C#
    ConnectionStringSettings setting = ConfigurationManager.ConnectionStrings["sales"];
    DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);
    DbConnection connection = factory.CreateConnection();
    connection.ConnectionString = setting.ConnectionString;

    其实ADO.NET 2.0的配置给了我们一个不错的适配器类型配置思路,总结如下:

    首先,客户程序明确自己需要的接口ITarget。

    设计App.Config(或Web.Config,有可能还会涉及Machine.Config)的结构,考虑到扩展和需要,可以把这个配置部分设计为一个ConfigurationElementCollection,可以动态增加。

    考虑Adapter还需要调整哪些特性,比如数据访问中的Package Size之类的参数,如果参数的数量和结构非常稳定,可以设计为每个ITarget配置节点下面的子ConfigurationElement,但如果不 同ITarget类型需要的参数数量不同,内容也不一定,则在每个ITarget节点下增加一个 ConfigurationElementCollection。

    我们完成或采购第三方实现ITarget的类库。

    为这些类库里面实现了ITarget的类型起一个逻辑名称,并把它们的Quanlified名称登记在每个ITarget的ConfigurationElement中,相关的参数顺次登记在子节点中。

    按照我们在创建型模式已经介绍的方法,增加一个工厂类,按照逻辑名称创建ITarget。

    您也可以把认为"固定"的参数定义在ITarget的ConfigurationElement上,不过除非是非常必要而且固定的,否则还是算了。把一个Name/Value Pair传递给具体Adapter,后者将酌情办理。

    为什么要给每个具体Adapter起个逻辑名称呢?这是为了让你的应用能与具体的Adaptee有效隔离,比如您的业务是操作销售数据,那么开发最 好基于一个名为"Sales"的逻辑数据库,至于系统上线后,把它放在ORACLE里还是SQL Server里,放在哪台服务器上,进行配置即可,当然您的应用首先要使用通用的SQL标准完成。)

  • 相关阅读:
    azure备份虚拟机
    本地git部署web连接azure的git存储库
    dnsmasq服务的安装与配置
    hadoop错误- slave节点无法启动data node数据节点进程,但是master节点datanode正常启动
    hadoop错误--转发-hadoop启动遇到的各种问题
    hadoop错误--集群启动master时namenode进程无法启动
    c++的字节对齐
    fstream 和 iostream
    C语言的声明的优先级规则
    齐次矩阵
  • 原文地址:https://www.cnblogs.com/shihao/p/2555466.html
Copyright © 2011-2022 走看看