在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。 项目整
在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。
项目整体结构如下图所示:
IDBHelper接口定义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Database.Instance.Interface
{
public interface IDBHelper
{
/// <summary>
/// 创建数据
/// </summary>
void Create();
/// <summary>
/// 更新数据
/// </summary>
void Update();
/// <summary>
/// 读取数据
/// </summary>
void Retrieve();
/// <summary>
/// 删除数据
/// </summary>
void Delete();
}
}
OracleDBHelper类定义如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Database.Instance.Interface;
namespace Database.Instance.Oracle
{
public class OracleDBHelper :IDBHelper
{
public void Create()
{
Console.WriteLine("这是Oracle数据库执行创建操作");
}
public void Update()
{
Console.WriteLine("这是Oracle数据库执行更新操作");
}
public void Retrieve()
{
Console.WriteLine("这是Oracle数据库执行读取操作");
}
public void Delete()
{
Console.WriteLine("这是Oracle数据库执行删除操作");
}
}
}
SQLServerDBHelper类定义如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Database.Instance.Interface;
namespace Database.Instance.SQL_Server
{
public class SQLServerDBHelper:IDBHelper
{
public void Create()
{
Console.WriteLine("这是SQL Server数据库执行创建操作");
}
public void Update()
{
Console.WriteLine("这是SQL Server数据库执行更新操作");
}
public void Retrieve()
{
Console.WriteLine("这是SQL Server数据库执行读取操作");
}
public void Delete()
{
Console.WriteLine("这是SQL Server数据库执行删除操作");
}
}
}
使用原始的方法实现代码如下:
using Database.Instance.Interface;
using Database.Instance.Oracle;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace MyReflection
{
class Program
{
static void Main(string[] args)
{
// 实例化(调用Oracle数据库)
IDBHelper dbHelper = new OracleDBHelper();
// 调用方法
dbHelper.Create();
dbHelper.Update();
dbHelper.Retrieve();
dbHelper.Delete();
Console.ReadKey();
}
}
}
程序运行结果:
存在的问题:如果换一种数据库,那么就需要修改实例化的代码,例如更换SQL Server数据库,那么代码修改如下:
IDBHelper dbHelper = new SQLServerDBHelper();
这样很不方便,每次更换数据库的时候,都需要修改实例化的代码,有没有什么方便的方法可以做到不需要修改代码就可以实现更换数据库呢?办法就是使用反射加配置文件实现。
配置文件结构如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--key表示定义的接口 value格式 要加载的程序集名称,要实例化的类 value值中间以','分割-->
<add key="Database.Instance.Interface.IDBHelper" value="Database.Instance,Database.Instance.Oracle.OracleDBHelper"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".netFramework,Version=v4.5.1" />
</startup>
</configuration>
Program类定义如下:
using Database.Instance.Interface;
using Database.Instance.Oracle;
using Database.Instance.SQL_Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace MyReflection
{
class Program
{
static void Main(string[] args)
{
// 根据key值读取对应的value值
string[] config = ConfigurationManager.AppSettings["Database.Instance.Interface.IDBHelper"].Split(',');
// 加载程序集 config[0]=Database.Instance
Assembly assembly = Assembly.Load(config[0]);
// 根据类的完全限定名找出类型 config[1]= Database.Instance.Oracle.OracleDBHelper
Type type = assembly.GetType(config[1]);
// 根据类型创建对象
object obj = Activator.CreateInstance(type);
//实例化
IDBHelper dbHelper = obj as IDBHelper;
dbHelper.Create();
dbHelper.Update();
dbHelper.Retrieve();
dbHelper.Delete();
Console.ReadKey();
}
}
}
运行结果如下:
如果更新数据库,只需要更新配置文件中value的值即可,例如要更换SQL Server数据库,配置文件修改如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--key表示定义的接口 value格式 要加载的程序集名称,要实例化的类 value值中间以','分割-->
<add key="Database.Instance.Interface.IDBHelper" value="Database.Instance,Database.Instance.SQL_Server.SQLServerDBHelper"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
</configuration>
Program类不需要修改,运行结果如下:
--结束END--
本文标题: C#利用反射实现多数据库访问
本文链接: https://lsjlt.com/news/141541.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0