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


           《大话设计模式》中第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
        '通过配置文件获取D层程序集的名称和命名空间的名称(普通情况下同样):DAL  
        Dim AssemblyName As String = System.Configuration.ConfigurationManager.AppSettings("assName")
        '数据库类型为:Sqlserver  
        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 数据库时的类名和方法就能够了,而不须要更改程序的其它程序集(其它的层)。见下图


    小结

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

  • 相关阅读:
    《大道至简》第一章读后感
    第一次随笔,献给结束大一的自己
    altium designer(AD13)隐藏敷铜的方法
    win下如何生成 github ssh公钥 GIT
    怎么把实际路径是英文的文件夹显示中文名?
    Linux GRUB手动安装方法详解
    Altium designer 如何将2D PCB转换成3D
    C++ 谓词(predicate) 与 仿函数 ( functor (function object))
    重载信号函数,解决参数问题
    VS2017常用快快捷键
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5151204.html
Copyright © 2020-2023  润新知