前言
前面学习了反射的基本范式,并且做了一些尝试,但遗留了一个问题,反射有什么作用,这里将会用一个例子来说明反射之Assembly的强大与应用所在。
目标
实现一个可配置、可扩展的应用,这也就是Assembly加载dll的意义所在之一。
正文
1、创建一个类库,实现以下代码
//接口类
namespace ReflectionDemo
{
public interface IDBHelp
{
void Query();
}
}
//一个继承了接口的类文件,模拟Mysql数据库查询上下文
namespace ReflectionDemo
{
public class MySqlHelp:IDBHelp
{
public MySqlHelp()
{
Console.WriteLine("Excute。。。");
}
public void Query()
{
Console.WriteLine("Excute Qurety in {0}",GetType().FullName);
}
}
}
2、创建一个工厂类,专门创建数据库连接对象
public class Factory
{
private static string IdbHelpConfig = ConfigurationManager.AppSettings["IDBHelperConfig"];
private static string DllName = IdbHelpConfig.Split(',')[1];
private static string TypeName = IdbHelpConfig.Split(',')[0];
public static IDBHelp CreateHelp()
{
//加载dll
Assembly assembly = Assembly.Load(DllName); //程序集的名称,不带文件类型,从当前执行目录加载,需要添加引用,或者复制到当前执行目录
//获取类型名称,参数为完整名称:命名空间+类名称
Type type = assembly.GetType(TypeName);
//创建对象
object objHelp = Activator.CreateInstance(type);
IDBHelp idbHelp = (IDBHelp)objHelp;
//返回实例
return idbHelp;
}
}
以上代码就是利用反射来创建一个数据库连接实例,创建的具体类型是通过读取配置文件来指定的,所以实现了一种可配置,当需要连接其他数据库时只需要修改配置文件即可。配置文件中指定了动态库的名称和类型名称,格式如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<appSettings>
<add key="IDBHelperConfig" value="ReflectionDemo.MySqlHelp,ReflectionDemo"/>
</appSettings>
<connectionStrings>
<!--数据库连接字符串-->
<add name="Customers" connectionString="Data Source=xxx; Database=Customers; User ID=sa; Password=Passw0rd; MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
3、使用工厂创建的实例调用方法
IDBHelp idbHelp = Factory.CreateHelp();
idbHelp.Query();
结尾
以上就实现了程序的可配置、可扩展,当需要连接其他数据库时只需要提供一个类似的dll,并修改配置文件就可实现相应的功能。类似的dll是要求新增的dll需要继承同样的接口并实现相应的方法。
文中有涉及到一个读取配置文件的操作,这里不做介绍,欲知原有请移步至“配置文件操作“笔记一文。