前言
接着上篇继续,上篇主要介绍配置文件的运用,本篇则介绍抽象工厂+反射与配置文件的结合使用。
抽象工厂+反射
(一)简介
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
小结:这样做不会报错,但是耦合度太高,有待改进。
配置文件:
<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
小结:同样可以实现反射,抽象出来了命名空间名称,但不符合开放-封闭原则,无法实现通过扩展而非更改就实现更换数据库的功能。
配置文件:
<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”或它的某一个依赖项
2.解决方法:右击DAL层——属性——编译——生成输出路径(...UI层/bin/debug)
我们的程序从UI层启动,程序内容均与UI层有直接或间接的关系,UI层的bin目录用来保存项目生成后的程序集。
通过七层的包图,我们可以看出,UI层直接或间接的与Facede层、BLL层、Factory层、IDAL层产生联系,因此UI层文件夹下会产生相关程序集的文件,而DAL层则不在其中,因此我们需要通过一些操作使UI层需要的文件出现在指定文件夹下。
小结
从重构开始,我们就接触到了抽象工厂、反射、配置文件的相关知识,然而一直理解的不够到位,只知其一,不知其二。现阶段的学习,我们不光需要知道怎么做是对的,还需要知道为什么对。
如有错误,欢迎指正~~~
请使用手机"扫一扫"x