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

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

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

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;可以优化设置…

关于tensorflow的碎片

1、突然间可视化tensorflow报错&#xff1a;ImportError: cannot import name ‘monitoring’ 解决&#xff1a; pip uninstall tensorflow_estimator pip install -Iv tensorflow_estimator1.13.02、tensorflow可视化查看语句&#xff1a; tensorboard --logdir日志路径地址…

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

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

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

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

洛谷 P1656 炸铁路

题目描述 因为某国被某红色政权残酷的高压暴力统治。美国派出将军uim&#xff0c;对该国进行战略性措施&#xff0c;以解救涂炭的生灵。 该国有n个城市&#xff0c;这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。 uim发现有些铁路被毁坏之后&#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…

python实现栈的操作入站出站查找元素等_Python实现的栈(Stack)

前言Python本身已有顺序表(List、Tupple)的实现&#xff0c;所以这里从栈开始。什么是栈想象一摞被堆起来的书&#xff0c;这就是栈。这堆书的特点是&#xff0c;最后被堆进去的书&#xff0c;永远在最上面。从这堆书里面取一本书出来&#xff0c;取哪本书最方便&#xff1f;肯…

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;也是研究智能驾驶理论与技术的基础。不同智能驾驶试验平台的传感器型号、数量、安装位置…

springboot中获得app_在SpringBoot中读取环境变量

What is the best way to read environment variables in SpringBoot?In Java I did it using:String foo System.getenv("bar");Is it possible to do it using Value annotation?解决方案Spring Boot allows you to externalize your configuration so you can …

jdk+Tomcat环境搭建

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

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

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

QMap与QHash

关联容器可以保存任意多个具有相同类型的项&#xff0c;且它们由一个键索引。Qt提供两个主要的关联容器类&#xff1a;QMap<K, T>和QHash<K, T>。 QMap<K, T>是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的查找插入性能及键序的迭代。…

工业机器人滑膜变结构控制技术_机器人智能滑模变结构控制方法的研究

学校代号 10532 学 号 S150900769 分 类 号 TP241 密 级 公开 硕士学位论文 机器人智能滑模变结构控制方法的研究 学位申请人姓名 张爱林培 养 单 位 电气与信息工程学院导师姓名及职称 谢宏 副教授学 科 专 业 控制科学与工程 研 究 方 向 控制理论与控制工程论 文 提 交 日 期…

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

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

NGINX下配置CACHE-CONTROL

转载的&#xff0c;那个页面让关了&#xff0c;&#xff0c;没标明请谅解。 HTTP协议的Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-a…

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

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