谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

《大话设计模式》中第15章中《就不能不换DB吗?》引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序。当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了这对组合的奥秘。

抽象工厂模式(Abstract Factory)

提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。知道它是用来创建工厂的就OK了。

反射

提供了封装程序集、模块和类型的对象。这里仅仅用到反射的一部分功能。且记住它的格式:

Assembly.Load(“程序集名称” CreateInstance(“命名空间 类名称”)

配置文件 

存在于UI层,名字为App.config ,在程序打包发布后,仍可以从安装包中找到该文件并加以更改。(其它不再赘述)

按照大鸟的思路,这种组合写法就能够方便的更改DB,在程序需要更改数据库时不需要重新返工,只需要从配置文件中,把数据库的名字更改一下就Ok了。我把大鸟的思路写一下。(《大话》中的代码是用C#语言写的,而我是在vb.net 版的机房收费系统中理顺思路的,所以以下代码均为vb.net 代码,大同小异)

Factory 中 DataAccess类

<span style="font-size:18px;">Imports System.Configuration    '配置文件命名空间
Imports System.Reflection       '添加对反射的引用
Public Class DataAccess
    '程序集名称(同时代表命名空间名称):DAL
    Dim AssemblyName As String = System.Configuration.ConfigurationManager.AppSettings("assName")
    '数据库类型:Sql
    Dim db As String = System.Configuration.ConfigurationManager.AppSettings("DB")
    '创建D层类SqlUserInfoDAL的实例
    Public Function CreateUserInfo() As IDAL.IUserInfo
        Dim dalUserInfoName As String = AssemblyName & "." & db & "UserInfoDAL"        '要实例化的D层类的名称
        Return CType(Assembly.Load(AssemblyName).CreateInstance(dalUserInfoName), IUserInfo)
    End Function
End Class</span>

配置文件中添加

<span style="font-size:18px;">      <appSettings>
          <add key ="assName" value ="DAL"/>
          <add key ="DB" value ="Sqlserver"/>
      </appSettings></span>

如果需要更改数据库比如说要把Sqlserver 更改为Access即可 (这就要求我们在D层建类时,严格命名,把Sql里的类名前面应该是Sqlserver开头,Access数据库时类名应该用Access开头。)如下图:

但是我在敲这一部分时,是这样写的(最初的最初,我没有想着要给系统更换数据库,所以某些变量和方法命名时没有考虑把数据库的选择表达出来)

Factory 中 DataAccess类

<span style="font-size:18px;">Imports System.Reflection    '添加对反射的引用
Imports System.Configuration  '添加对配置文件的引用
Public Class DataAccess
    Dim strDALName As String = System.Configuration.ConfigurationSettings.AppSettings("DALName")  '定义一个字符串strDALName,通过配置文件获取D层程序集的名称和命名空间的名称(一般情况下相同)并赋值给所声明的变量strDALName

    ' 创建一个用户User接口,并把对应的类名称关联上
    Public Function CreateIUser() As IDAL.IUser
        '通过配置文件和反射,实例化接口并能够通过更改配置文件的内容更改 实例化D层的程序集和命名空间下的类
        Return CType(Assembly.Load(strDALName).CreateInstance(strDALName + "." + "UserDAL"), IDAL.IUser)
    End Function
    ' 创建一个学生信息StudentInfo接口,并把对应类名称关联上
    Function CreateIStudent() As IDAL.IStudentInfo
        Return CType(Assembly.Load(strDALName).CreateInstance(strDALName + "." + "StudentInfoDAL"), IDAL.IStudentInfo)
    End Function
End Class</span>

配置文件中这样写的

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8" ?>
<configuration>

      <configSections>
      </configSections>
      <connectionStrings>
            <add name="UI.My.MySettings.MyChargeSystemConnectionString" connectionString="Data Source=(local);Initial Catalog=MyChargeSystem;User ID=sa;Password=123456"
                  providerName="System.Data.SqlClient" />
      </connectionStrings>
      <appSettings>
          <add key="strConnection" value="Server=bao;DataBase=MyChargeSystem;User ID=sa;Password=123456"  />
          <add key ="DALName" value ="SqlServerDAL"/>
      </appSettings>

      <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

    </startup>

</configuration></span>

大家只要关注:<add key ="DALName" value ="SqlServerDAL"/>  这一行就可以了,把配置文件全部内容贴出来只是让大家了解配置文件内容的全貌。

考虑到以后可能更换数据库,例如,日后我需要把现在所用的sqlserver 数据库更换为Access,我们只需要重新添加一个程序集即可。例如把该程序集命名为AccessDAL,紧接着,配置文件中把

<add key ="DALName" value ="SqlServerDAL"/>

更改为

<add key ="DALName" value ="AccessDAL"/>


然后在里面添加其他类,类名和里面的方法还应用SqlServer 数据库时的类名和方法就可以了,而不需要更改程序的其他程序集(其他的层)。见下图

小结

不管黑猫白猫,逮住老鼠就是好猫。解决问题的方法往往不局限于一种,我相信抽象工厂+反射+配置文件 这个组合不仅仅能更换一个数据库,还能解决其他的一些问题。这都需要我们对写程序有一种钻研和痴迷的精神,就像小菜最后说的:无痴迷,不成功。相信大家经过不懈的努力,都会成为优秀的程序员。

时间: 2024-08-08 09:41:46

谈一谈:抽象工厂+反射+配置文件 实现数据访问程序的相关文章

思想上移,行动下移——抽象工厂+反射+配置文件

从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏.虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单.可以说小菜只是帮我们理解了各个设计模式的用途以及有确定,真正的理解还需要我们自己动手实践. 为什么要用抽象工厂? 主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库.引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可

应用抽象工厂+反射实现通用数据源的设计(二)

上篇博文到学生表的一个接口由SqlServerDal和AccessDal层实现具体的方法. 下面定义一个生产抽象产品工厂的接口: 五:定义MySchoolIFactory下IStudentFactory的工厂(引用IStudens接口): public interface IStudentFactory { //产生学生接口的抽象工厂接口 IStudent CreateStudent(); } 六:有两个具体的工厂:SQLServerFactory和AccessFactory(引用MySchoo

设计模式在实际业务应用中的介绍之1——抽象工厂模式实现对数据库访问组件的封装

设计模式在实际业务应用中的介绍之1--抽象工厂模式实现对数据库访问组件的封装 基于C#打造的通用数据库访问组件 基于C#打造的通用数据库访问组件,完全支持开闭原则,设计上支持可扩展支持任意主流数据库,目前组件只实现了Oracle.MS SQL.MySQL三种库. 该组件实现简单.架构清晰,目前组件只包括5个类文件,兼容了三种数据库,组件实现采用了单例模式.工厂模式. 获取组件源码请入QQ群706224870,在群文件中下载.入群验证信息:codefc 下面简单描述下实现思路: 5个类文件如下:D

设计模式学习之简单工厂+反射+配置文件

3.用反射+配置文件的方法重新实现大话设计模式课本上15章15.7的例题 问题分析:相比抽象工厂,用DataAccess类代替了工厂接口以及工厂类,再加上使用反射+配置文件的方式,可以做到不对编译好的程序作出改变就能修改数据库种类,客户端可以只是用DateAccess进行数据库访问实例的创建,达到了解耦的目的. UML图: package com.cmc; //用户数据类 public class User { private int id; private String name; publi

项目总结——谈谈封装(抽象工厂+反射+缓存机制)

今天想给大家说的也是刚刚结束的项目中遇到的一个优秀的封装,当然也要拿出来给大家分享了. 背景交代,我们的项目是一个BS的项目,基本的架构是工厂模式三层,所以就用到了抽象工厂加反射,今天要给大家讲的也就是这块的东西——使用缓存文件. 背景交代完毕. 一.首先说一下什么是缓存文件? msdn上说: 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每

应用抽象工厂+反射实现通用数据源的设计(三)

九:UI层 通过反射实现时,得自动添加以下的文件: 如果要换成Access数据库时需要考入的文件: 改配置文件:

使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......

Put aside the fog and see the essence 解决问题之前,要明白问题为什么会出现 如果只想单纯的解决这个问题的话,直接把错误复制然后百度就会出现很多很多解决方案 如果你想明白为什么会出现这个错误 1.首先了解反射的机制 任何类库编译完成之后都会生成.dll文件,反射就是从当前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll 2.我们来看一下程序的代码和文件 web.config DalFacoty代码 我们找到web层的bin目

通过反射实现多数据访问

每种数据库都有自己的链接组件.比如:System.Data.SqlClient,System.Data.OracleClient,Oracle.DataAccess.Client,MySql.Data,IBM.Data.DB2,Sybase.Data.AseClient,iAnywhere.Data.AsaClient,Npgsql等等! 反射: 通过[Type类]可以访问任意数据类型信息,常使用Type类的静态方法GetType(),如Type t =Type.GetType("MySql.D

winform中利用反射实现泛型数据访问对象基类

考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDao<T> where T :