反射应用二:利用反射加配置文件实现多数据库的访问
在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。
项目整体结构如下图所示:
1、Database.Instance是一个类库文件,IDBHelper是一个接口,封装的访问数据库数据的CURD方法,OracleDBHelper和SQLServerDBHelper类实现IDBHelper接口,分别用来访问Oracle数据库和SQL Server数据库,接口和类的定义如下:
IDBHelper接口定义
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Database.Instance.Interface 8 { 9 public interface IDBHelper 10 { 11 /// <summary> 12 /// 创建数据 13 /// </summary> 14 void Create(); 15 16 /// <summary> 17 /// 更新数据 18 /// </summary> 19 void Update(); 20 21 /// <summary> 22 /// 读取数据 23 /// </summary> 24 void Retrieve(); 25 26 /// <summary> 27 /// 删除数据 28 /// </summary> 29 void Delete(); 30 } 31 }
OracleDBHelper类定义如下
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Database.Instance.Interface; 7 8 namespace Database.Instance.Oracle 9 { 10 public class OracleDBHelper :IDBHelper 11 { 12 public void Create() 13 { 14 Console.WriteLine("这是Oracle数据库执行创建操作"); 15 } 16 17 public void Update() 18 { 19 Console.WriteLine("这是Oracle数据库执行更新操作"); 20 } 21 22 public void Retrieve() 23 { 24 Console.WriteLine("这是Oracle数据库执行读取操作"); 25 } 26 27 public void Delete() 28 { 29 Console.WriteLine("这是Oracle数据库执行删除操作"); 30 } 31 } 32 }
SQLServerDBHelper类定义如下
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Database.Instance.Interface; 7 8 namespace Database.Instance.SQL_Server 9 { 10 public class SQLServerDBHelper:IDBHelper 11 { 12 public void Create() 13 { 14 Console.WriteLine("这是SQL Server数据库执行创建操作"); 15 } 16 17 public void Update() 18 { 19 Console.WriteLine("这是SQL Server数据库执行更新操作"); 20 } 21 22 public void Retrieve() 23 { 24 Console.WriteLine("这是SQL Server数据库执行读取操作"); 25 } 26 27 public void Delete() 28 { 29 Console.WriteLine("这是SQL Server数据库执行删除操作"); 30 } 31 } 32 }
2、MyReflection是一个控制台程序,用来测试
一、使用原始方法实现
使用原始的方法实现代码如下:
1 using Database.Instance.Interface; 2 using Database.Instance.Oracle; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 using System.Reflection; 9 using System.Configuration; 10 11 namespace MyReflection 12 { 13 class Program 14 { 15 static void Main(string[] args) 16 { 17 // 实例化(调用Oracle数据库) 18 IDBHelper dbHelper = new OracleDBHelper(); 19 // 调用方法 20 dbHelper.Create(); 21 dbHelper.Update(); 22 dbHelper.Retrieve(); 23 dbHelper.Delete(); 24 25 Console.ReadKey(); 26 } 27 } 28 }
程序运行结果:
存在的问题:如果换一种数据库,那么就需要修改实例化的代码,例如更换SQL Server数据库,那么代码修改如下:
IDBHelper dbHelper = new SQLServerDBHelper();
这样很不方便,每次更换数据库的时候,都需要修改实例化的代码,有没有什么方便的方法可以做到不需要修改代码就可以实现更换数据库呢?办法就是使用反射加配置文件实现。
二、使用反射加配置文件实现
配置文件结构如下:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <appSettings> 4 <!--key表示定义的接口 value格式 要加载的程序集名称,要实例化的类 value值中间以','分割--> 5 <add key="Database.Instance.Interface.IDBHelper" value="Database.Instance,Database.Instance.Oracle.OracleDBHelper"/> 6 </appSettings> 7 <startup> 8 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> 9 </startup> 10 </configuration>
Program类定义如下:
1 using Database.Instance.Interface; 2 using Database.Instance.Oracle; 3 using Database.Instance.SQL_Server; 4 using System; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Reflection; 10 using System.Configuration; 11 12 namespace MyReflection 13 { 14 class Program 15 { 16 static void Main(string[] args) 17 { 18 // 根据key值读取对应的value值 19 string[] config = ConfigurationManager.AppSettings["Database.Instance.Interface.IDBHelper"].Split(','); 20 // 加载程序集 config[0]=Database.Instance 21 Assembly assembly = Assembly.Load(config[0]); 22 23 // 根据类的完全限定名找出类型 config[1]= Database.Instance.Oracle.OracleDBHelper 24 Type type = assembly.GetType(config[1]); 25 // 根据类型创建对象 26 object obj = Activator.CreateInstance(type); 27 //实例化 28 IDBHelper dbHelper = obj as IDBHelper; 29 dbHelper.Create(); 30 dbHelper.Update(); 31 dbHelper.Retrieve(); 32 dbHelper.Delete(); 33 Console.ReadKey(); 34 } 35 } 36 }
运行结果如下:
如果更新数据库,只需要更新配置文件中value的值即可,例如要更换SQL Server数据库,配置文件修改如下:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <appSettings> 4 <!--key表示定义的接口 value格式 要加载的程序集名称,要实例化的类 value值中间以','分割--> 5 <add key="Database.Instance.Interface.IDBHelper" value="Database.Instance,Database.Instance.SQL_Server.SQLServerDBHelper"/> 6 </appSettings> 7 <startup> 8 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> 9 </startup> 10 </configuration>
Program类不需要修改,运行结果如下:
示例代码下载地址:https://pan.baidu.com/s/1mkf20WC
转载于:https://www.cnblogs.com/dotnet261010/p/8276870.html
反射应用二:利用反射加配置文件实现多数据库的访问相关推荐
- Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...
- java 反射 静态成员_java 利用反射获取内部类静态成员变量的值
待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 1 ArrayList list1 = new ArrayL ...
- 利用反射实现类的动态加载
为什么80%的码农都做不了架构师?>>> //首先定义一个接口来隔离类: public interface Operator { // public java.util.Lis ...
- 利用反射和xml配置文件手写一个小型的框架
通用的增删改查 1. 利用xml配置实体类和数据库表名的映射关系 2. 根据xml设计,用正确的数据结构映射类封装好xml信息 3. 得到数据库连接前,读取xml信息,用map封装成映射数据 4. 写 ...
- Java利用反射动态加载类实战
package com.web.common.utility.reflector; import java.io.Serializable; import java.lang.reflect.Cons ...
- C# 利用反射动态创建对象[摘录]
摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...
- 利用反射做一个简易 Spring IOC 容器,模仿其装配功能
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/wenwenaier/article/ details/115549343 自己用代码模仿一个简易的SpringIOC容器,模仿 ...
- JAVA基础 (二)反射 深入解析反射机制
在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于 ...
最新文章
- html大作业_杜绝家长作业 关键是如何监督
- [css] 解释下css3的flexbox(弹性盒布局模型),以及它应用场景有哪些?
- 利用selenium webdriver点击alert提示框
- mybatisplus 一次性执行多条SQL语句插入(Mysql篇)
- TX Text Control文字处理教程(11)使用文本框
- Mac安装mysql数据库【亲测有用】
- NPM Unexpected end of JSON input while parsing near
- Linux网络协议:当eBPF遇上Linux内核网络 | Linux内核之旅
- 错误3:系统找不到指定的路径
- 编程入门先学什么python-自学编程入门,先学什么语言好?
- 转:WaitForSingleObject()函数、WaitForMultipleObject()函数
- 【CPRI协议v7.0】CPRI 8b/10b编码Scrambling功能
- 网易公开课计算机原理,网易公开课给大一新生“量身订做”精品课程
- 大华sdk(java)上传人脸图片到人脸库,订阅人脸识别对比
- 使用python快速开发桌面小工具
- 4个女人要过一座桥的问题
- 进程监控工具 Procmon有Linux版本了
- JBPM工作流引擎内核设计思想及构架
- artemis服务_Artemis
- SSM4==通过XML配置spring 事务,通过纯注解配置spring 事务
热门文章
- .net get set 初始化_.NET项目升级:可为空引用
- 二十五、PHP框架Laravel学习笔记——模型的一对一关联
- LeetCode 6071. 完成所有任务需要的最少轮数
- LeetCode MySQL 626. 换座位
- LeetCode 281. 锯齿迭代器(map+vector)
- LeetCode 1496. 判断路径是否相交(set)
- 图Graph--最短路径算法(Shortest Path Algorithm)
- 数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)
- 用python写一个手机app签到脚本_利用Python实现App自动签到领取积分
- python考试名词解释_python公开课|python专有名词居然有这么多,python专有名词解释已做好...