反射应用二:利用反射加配置文件实现多数据库的访问

在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。

项目整体结构如下图所示:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020未来科学大奖获奖名单揭晓

来源&#xff1a;高分子科技9月6日上午&#xff0c;2020 年未来科学大奖重磅揭晓&#xff0c;三大奖项获奖者分别为&#xff1a;未来科学大奖生命科学奖获奖者&#xff1a;张亭栋、王振义未来科学大奖物质科学奖获奖者&#xff1a;卢柯未来科学大奖数学与计算机科学奖获奖者&am…

与40mhz信道不兼容设置_物理信道发射功率

先上图与HSDPA有关的三个物理信道HS_SICH(TS2),HS_PDSCH(TS3,4,5),HS_SCCH(TS6).&#xff11;、 PCCPCH_power:PCCPCH承载BCH&#xff0c;为TS0时隙码道1和码道2的功率之和&#xff0c;以固定功率发射&#xff0c;一般设为30dBm。根据具体无线环境&#xff0c;可以优化设置…

带父节点的平衡二叉树_深入理解(二叉树、平衡二叉树、B-Tree、B+Tree )的区别

一、背景一般说MySQL的索引&#xff0c;都清楚其索引主要以B树为主&#xff0c;此外还有Hash、RTree、FullText。本文简要说明一下MySQL的BTree索引&#xff0c;以及和其相关的二叉树、平衡二叉树、B-Tree&#xff0c;相关的知识网上很多&#xff0c;为了方便自己更快、清楚的了…

2020年中国新基建人工智能产业链全景图深度分析汇总(附完整企业名单)

来源&#xff1a;北京物联网智能技术应用协会“新基建”是与传统基建相对应&#xff0c;结合新一轮科技革命和产业变革特征&#xff0c;面向国家战略需求&#xff0c;为经济社会的创新、协调、绿色、开放、共享发展提供底层支撑的具有乘数效应的战略性、网络型基础设施。其中“…

Word设置子标题跟随上级标题变化

1 先看看结果吧&#xff0c;结果可实现子标题跟随上级标题变动 2 设置各级标题 2.1 对于1级标题-“标题1”&#xff0c;修改标题样式样式基准&#xff1a;“正文”格式&#xff1a;段落&#xff1a;大纲级别&#xff1a;1级2.2 对于2级标题-“标题2”&#xff0c;修改标题样…

2压缩备份数据库_MySQL数据库备份

前端监控&#xff1a;www.webfunny.cn &#xff1b;只需要简单几步&#xff0c;就可以搭建一套属于自己的前端监控系统&#xff0c;快来试试吧。(github&#xff1a;webfunny_monitor)一、mysqldump 简介mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 …

人工智能和物联网:智慧城市的交通管理

来源&#xff1a;帮尼资讯当今的智慧城市由不断重塑城市地区的先进技术提供发展驱动力。人工智能和物联网对于世界的运作越来越不可或缺。基于云的服务、物联网、分析平台和许多AI工具正在改变城市居民与环境互动和在环境中出行的方式。纽约市AI咨询和开发机构Blue Orange Digi…

Linux 计划任务

1.计划任务&#xff1a;at一次性计划任务。 &#xff08;1&#xff09;/etc/init.d/atd status   #查看at命令是否开启。 &#xff08;2&#xff09;yum -y install at     #安装at命令 命令&#xff1a; # 一次性计划任务。命令&#xff1a;at 09:14 /回车    at&g…

李德毅院士:基于驾驶脑的智能驾驶车辆硬件平台架构

来源&#xff1a;中国工程院院刊转自&#xff1a;智车科技导 读&#xff1a; 智能驾驶车辆试验平台是人工智能科学、认知科学、控制科学等多个学科领域的最新理论与实践的成果&#xff0c;也是研究智能驾驶理论与技术的基础。不同智能驾驶试验平台的传感器型号、数量、安装位置…

jdk+Tomcat环境搭建

jdk安装与环境变量配置测试Java是否安装好&#xff0c;可以利用cmd命令提示符进行测试。在界面中输入Java&#xff0c;然后回车&#xff1b;得到下图所示的内容&#xff0c;说明安装成功了&#xff0c;可以进行环境变量配置了。进行环境变量配置&#xff0c;首先新建环境变量&a…

有关博弈人机混合智能的再思考

来源&#xff1a;人机与认知实验室【博弈智能研究是一个领域&#xff0c;不是一个学科&#xff0c;我们必须要用不同的方法论&#xff0c;从不同的角度来研究游戏&#xff0c;方法论、角度越多&#xff0c;博弈智能研究就会做得越好。】博弈智能是一种涉及感性&#xff08;尤其…

邬贺铨:工业互联网的网络技术

来源&#xff1a;工业互联网产业联盟在2020工业互联网大会开幕式上&#xff0c;中国工程院院士邬贺铨发表题为《工业互联网的网络技术》的主旨演讲&#xff0c;从工业互联网物理层技术、链路层技术、网络层技术三个方面&#xff0c;对现有通信网络如何满足工业互联网高速发展要…

无返回值_只需一步,在Spring Boot中统一Restful API返回值格式与处理异常

统一返回值在前后端分离大行其道的今天&#xff0c;有一个统一的返回值格式不仅能使我们的接口看起来更漂亮&#xff0c;而且还可以使前端可以统一处理很多东西&#xff0c;避免很多问题的产生。比较通用的返回值格式如下&#xff1a;public class Result { // 接口调用成功或者…

什么是边缘计算(Edge AI)?

来源&#xff1a;万物智能视界边缘AI发源于边缘计算。边缘计算也称为边缘处理&#xff0c;是一种将服务器放置在本地设备附近网络技术, 这有助于降低系统的处理负载&#xff0c;解决数据传输的延迟问题。这样的处理是在传感器附近或设备产生数据的位置进行的&#xff0c;因此称…

VUE全局api

一、什么是全局API&#xff1f; 全局API并不在构造器里&#xff0c;而是先声明全局变量或者直接在Vue上定义一些新功能&#xff0c;Vue内置了一些全局API&#xff0c;比如我们今天要学习的指令Vue.directive。说的简单些就是&#xff0c;在构造器外部用Vue提供给我们的API函数来…

美国运通使用AI技术检测欺诈行为 增强安全性

来源丨Forbes编译丨科技行者多年以来&#xff0c;美国运通一直是人工智能与认知技术领域的领导者。作为坐拥有庞大忠实客户群体的全球金融服务机构&#xff0c;保障客户账户安全一直是运通职能的重中之重。在很长一段时间里&#xff0c;发现并制止欺诈行为一直是美国运通公司的…

未来趋势?通过无线技术管理汽车电池,可消除90%物理布线

电动汽车的电池寿命要求远比手机电池要高。来源 | 雷锋网作者 | 伍文靓雷锋网按&#xff0c;当智能手机中的电池损耗殆尽&#xff0c;无法满足正常使用的续航体验时&#xff0c;用户往往会选择换一台新的设备&#xff0c;以此来解决问题。这是十分常规的操作。然而&#xff0c…

RF MEMS开关时代将开启?

来源&#xff1a;内容编译自「IEEE」&#xff0c;谢谢。二十年前&#xff0c;专门研究射频电路的工程师设想了一种“理想的开关”。这种开关“打开”时&#xff0c;它将具有超低电阻&#xff0c;“关闭”时将具有超高电阻等等。它体积小巧&#xff0c;快速&#xff0c;易于制造…

3dmax体积雾渲染不出来_【扮家家云渲染效果图】3Dmax体积光制作丛林光束|干货教程...

首先打开场景文件场景中创建了一些树木组成了森林的效果。首先要为场景创建灯光。单击创建&#xff0c;选择灯光&#xff0c;将类型切换为标准。接着单击目标平行光。在场景中拖拽进行创建&#xff0c;创建一盏目标平行光&#xff0c;然后单击修改&#xff0c;勾选阴影&#xf…

干货 | 机器人视觉三维成像技术全解析

来源&#xff1a;机器人创新生态在工业4.0时代&#xff0c;国家智能制造高速发展&#xff0c;传统的编程来执行某一动作的机器人已经难以满足现今的自动化需求。在很多应用场景下&#xff0c;需要为工业机器人安装一双眼睛&#xff0c;即机器人视觉成像感知系统&#xff0c;使机…