机房重构准备工作(3)---反射+抽象工厂

来源:互联网 发布:华硕超频软件 编辑:程序博客网 时间:2024/04/30 20:11

在做机房重构的时候,感觉就像在玩一个俄罗斯套娃一样,需要一层层的剥开,然后逐渐弄懂每一个过程。在前几次的实践之后,终于到了搞反射的时候了

反射,在学习设计模式的时候有学到过,但是给的内容却不是很多,书里边只强调了一些基本的格式要求比如说在使用反射的时候要先引用Reflection然后按照

Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”)的格式去书写就可以了

书中描述的很简单,但是在执行的却并没有那么简单。

在明白反射之前,我觉得有必要明白为什么要使用反射:在设计模式的书中,小菜的公司要求更换数据库,所以用到了反射的机制。那么在机房重构中,可能也不单单使用SQL Server数据库,如果在后期更换数据库的话,再修改代码,就和开闭原则相悖离了,所以在机房重构中要引用到反射的机制。其次,在使用反射的时候要做哪些工作:首先要有一个配置文件“APP.Config”在U层添加配置文件,配置文件中写明自己要使用的数据库:

<appSettings>      <add key="DB"  value="sql"/>            <add key="yu"  value="DAL"/>  </appSettings>

然后再去工厂层进行代码的编写:

1.首先要引用Reflection

Imports System.Reflection

2.读取配置文件中的内容

 Private Shared ReadOnly AssemblyName As String = ConfigurationManager.AppSettings("yu") '定义程序集名称变量,D层命名空间的名字 参照配置文件中的数据    Dim strDB As String = ConfigurationManager.AppSettings("DB") '表示读取配置文件

3.利用反射

  '创建用户表的工厂    Public Function CreateUserInfo() As IDAO.IUser        Dim className As String = AssemblyName + "." + "yu"        'AssemblyName是程序集的名称,db+UserDAL是DAL层中的SQLServerUserDAL的类名,        '之所以配置文件中写SQLserver,是因为D层中类名是SqlServerUserDAL.        '如果不用SQLserver数据库,那么就在factory中再建一个类,比如访问Access数据库,那么类名就叫做AccessUserDAL        Return CType(Assembly.Load(AssemblyName).CreateInstance(className), IUser)’这里就是书中提到的格式内容        '将实例化D层类通过向上转型转换为接口类,然后通过调用接口类中的函数来调用D层中实现该接口的函数End Function

但是仅仅这些还是不够的,在整理反射的时候,还会遇到其他的问题因为机房登录采用的是七层登录,但是在七层登录当中D层并没有其他的层能调用(引用)到D层,所以在反射的时候肯定会报错,在报错是该怎么做呢?




工厂层完整代码如下:

Imports System.ReflectionImports IDAOImports System.Data.DataTablePublic Class FacatoryUser    '利用反射+配置文件+抽象工厂    Private Shared ReadOnly AssemblyName As String = ConfigurationManager.AppSettings("yu") '定义程序集名称变量,D层命名空间的名字    'Dim strDB As String = ConfigurationManager.AppSettings("DB") '表示读取配置文件    '创建用户表的工厂    Public Function CreateUserInfo() As IDAO.IUser        Dim className As String = AssemblyName + "." + "UserDAL"        'AssemblyName是程序集的名称,db+UserDAL是DAL层中的SQLServerUserDAL的类名,        '之所以配置文件中写SQLserver,是因为D层中类名是SqlServerUserDAL.        '如果不用SQLserver数据库,那么就在factory中再建一个类,比如访问Access数据库,那么类名就叫做AccessUserDAL        Return CType(Assembly.Load(AssemblyName).CreateInstance(className), IUser)        '将实例化D层类通过向上转型转换为接口类,然后通过调用接口类中的函数来调用D层中实现该接口的函数    End FunctionEnd Class



0 0
原创粉丝点击