前言:

在学大话设计模式时,听大鸟说过这么一句话,“反射反射,程序猿的快乐”,而对这句话的解释是反射可以利用字符串来实例化对象,而变量是可以更换的,当时对这句话不太理解,而做七层登录的时候,在反射报错是必经之路,经过查资料理解了一些其中的原理,下面做一个记录。      

首先看下官方的反射作用:
在.Net Framework中提供了反射机制,可以在加载程序运行时,动态的获取和加载程序集(dll也就是动态链接库),获取程序集的信息,可以对程序集的类进行实例化,调用类中的方法等。

可能对这句话很无感,换成下面的说法:
在.Net Framework中提供了反射机制,可以在加载Factory层运行时,动态的获取和加载DAL层(dll也就是动态链接库),获取DAL层的信息,可以对DAL层的类进行实例化,调用DAL层类中的方法等。

而咱们的DAL层或者七层中的任意一层都是.dll文件,下图为证 (用于创建C#类库(.dll)的项目)

机房重构——反射+配置文件访问程序

那具体怎么做到的呢,就是用反射+配置文件访问程序

首先看配置文件

机房重构——反射+配置文件访问程序

有两个键值对

第一个键值对是通过配置文件去连接数据库,在SQLHelper中代码

string connStr = ConfigurationManager.AppSettings["connStr"];

在重构中并没有实现更换数据库的功能,当然可以通过反射去加

而在Factory工厂层中实现的是factory去访问DAL层,也就是第二个键值对,看下Factory工厂层代码

string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];//读取配置文件中DB的值DAL
public IDAL.LoginIDAL CreateUser()
{
    string ClassName = StrDB + "." + "LoginDAL";//程序集+类名
    IDAL.LoginIDAL idal =(IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);//将DAL转化为接口IDAL
    return idal;//返回IDAL接口
}

可能代码还有点不明确,再换一种写法

string dllName = "DAL";//指定程序集的名字DAL层
string fullName = "DAL.LoginDAL";//指定程序集的名字+类的名字
Assembly assembly = Assembly.Load(dllName);//程序集加载
IDAL.LoginIDAL idal = (IDAL.LoginIDAL)assembly.CreateInstance(fullName);//创建LoginDAL实例并转为idal接口中方法类型

而DAL是从配置文件中读出来的,而下面的代码是反射中(using System.Reflection;)的类

下面就可以推出来Factory层,IDAL层,DAL层之间的关系了
B层通过IDAL层访问D层实现解耦,而转换关系则是在Factory层,又实现了一次解耦!

      实际上反射的功能相当于程序集之间的引用(可以去看Factory层没有引用DAL层),而不同的是通过反射可以完全使用程序集中的东西,比如私有方法,反射的功能很强大,通过加载动态链接库就可以调用一个程序集中方法。

      至此反射在重构中的应用暂且理解到这,感谢您的阅读,还请斧正!

相关文章:

  • 2021-05-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-15
  • 2022-12-23
  • 2021-07-23
猜你喜欢
  • 2022-12-23
  • 2021-12-07
  • 2021-08-28
  • 2022-02-01
  • 2022-12-23
  • 2021-08-24
  • 2021-07-22
相关资源
相似解决方案