加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 07:35:20 所属栏目:百科 来源:网络整理
导读:前言 接着上篇继续,上篇主要介绍配置文件的运用,本篇则介绍抽象工厂+反射与配置文件的结合使用。 抽象工厂+反射 (一)简介 1.抽象工厂: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。(我认为,抽象工厂是把一些有关系的类的共

前言

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


抽象工厂+反射

(一)简介

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层需要的文件出现在指定文件夹下。


小结

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

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

请使用手机"扫一扫"x

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读