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

前端之家收集整理的这篇文章主要介绍了【机房重构】 抽象工厂+反射+配置文件(下)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

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


抽象工厂+反射

(一)简介

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.初次修改(第二版):

@R_502_382@:

 <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.再次修改(第三版)

@R_502_382@:

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

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

    '登录
    Public Function CheckUserInfo() As IDAL.IuserInfoDAL
        '声明要实例化的D层类的名称,字符串的最终结果是"DAL.sqlserverUserDAL",这里要注意的是相应D层类名即为sqlserverUserDAL
        '更改数据库:把@R_502_382@中的add name="DB"  value="sqlserver"的value值改为"Access",则不需更改程序,只需更改@R_502_382@的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
小结:这样就可以实现反射应有的功能,仅通过修改@R_502_382@,便可以更改数据库

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

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

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

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


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

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


小结

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

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

请使用手机"扫一扫"x 原文链接:https://www.f2er.com/vb/256764.html

猜你在找的VB相关文章