【机房重构】 抽象工厂+反射+配置文件(下)

前言

    接着上篇继续,上篇主要介绍配置文件的运用,本篇则介绍抽象工厂+反射与配置文件的结合使用。


抽象工厂+反射

(一)简介 

1.抽象工厂:

      提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。(我认为,抽象工厂是把一些有关系的类的共有的内容抽象出来,主要为了方便更换数据库。)

2.反射:

    将一个字符串通过CType函数实例化D层的一个类,达到使用的目的。

    我们可以理解成从箱子(抽象工厂)上的一个口(接口)通过镜子(反射)看到整个箱子的内容。

    我们通常用反射去除switch或if,解除分支判断带来的耦合。


(二)使用方法

1.简要介绍


实例(第一版):

Public Class LoginFactory
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")
    Public Shared Function CreateUserInfo() As IDAL.IuserInfoDAL
        Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "UserDAL"), IDAL.IuserInfoDAL)
    End Function
End Class

小结:这样做不会报错,但是耦合度太高,有待改进。


2.初次修改(第二版):

配置文件:

 <add key="DB"  value="DAL"/>	
工厂:

    Private Shared ReadOnly AssemblyName As String = "DAL" '数据程序集名称、命名空间(DAL) 
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")

    '登录
    Public Function CreateUserInfo() As IDAL.IcardInfo
        Dim classname As String = strDB + "." + "UserDAL" '声明要实例化的D层类的名称
        'CType函数将返回表达式显示地转换为指定的数据类型、对象、结构、类或接口后的结果  
        Return CType(Assembly.Load(AssemblyName).CreateInstance(classname), IDAL.IcardInfo)
    End Function

小结:同样可以实现反射,抽象出来了命名空间名称,但不符合开放-封闭原则,无法实现通过扩展而非更改就实现更换数据库的功能。


3.再次修改(第三版)

配置文件:

<add key="DB" value="Sqlserver"/>
工厂:

'创建D层的实例
    Private Shared ReadOnly AssemblyName As String = "DAL" '数据程序集名称、命名空间(DAL) 
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB") '与配置文件相关

    '登录
    Public Function CheckUserInfo() As IDAL.IuserInfoDAL
        '声明要实例化的D层类的名称,字符串的最终结果是"DAL.SqlserverUserDAL",这里要注意的是相应D层类名即为SqlserverUserDAL
        '更改数据库:把配置文件中的add name="DB"  value="Sqlserver"的value值改为"Access",则不需更改程序,只需更改配置文件的value值,即可实例化D层一个新的类AccessUserDAL
        '当然如果更改数据库,D层相应的类要提前写好。
        Dim classname As String = AssemblyName + "." + strDB + "UserDAL"
        'CType函数将返回表达式显示地转换为指定的数据类型、对象、结构、类或接口后的结果 
        '将实例化的D层类通过向上转型转换成接口类,然后通过调用接口类中的函数来调用D层中实现该接口的函数。
        Return CType(Assembly.Load(AssemblyName).CreateInstance(classname), IDAL.IuserInfoDAL)
    End Function
小结:这样就可以实现反射应有的功能,仅通过修改配置文件,便可以更改数据库。

(三)常见问题——未能加载文件或程序集“XXX”或它的某一个依赖项

1.错误原因:U层文件夹缺少dll文件

2.解决方法:右击DAL层——属性——编译——生成输出路径(...UI层/bin/debug)

3.为什么需要修改生成路径?


    我们的程序从UI层启动,程序内容均与UI层有直接或间接的关系,UI层的bin目录用来保存项目生成后的程序集。

    通过七层的包图,我们可以看出,UI层直接或间接的与Facede层、BLL层、Factory层、IDAL层产生联系,因此UI层文件夹下会产生相关程序集的文件,而DAL层则不在其中,因此我们需要通过一些操作使UI层需要的文件出现在指定文件夹下。


小结

    从重构开始,我们就接触到了抽象工厂、反射、配置文件的相关知识,然而一直理解的不够到位,只知其一,不知其二。现阶段的学习,我们不光需要知道怎么做是对的,还需要知道为什么对。

    如有错误,欢迎指正~~~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 70
    评论
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值