前言
当我们提到设计数据库无缝切换的时候,经常用到的办法就是用反射,连微软自带的例子Microsoft .NET Pet Shop也是如此。虽然如此,但一方面反射性能比较低,另一方面我觉得通过字符串的方式来切 换数据库难免不合适。近两天有想到用标准+冗余的办法来实现同样的需求,目前处于理论阶段,正在实 践中,现分享出来大家一起讨论下:)
正文
一、理论:
这里例举OracleDAL和SqlServerDAL。
将OracleDAL的dll名称设置为DAL.OracleDAL.dll,将SqlServerDAL名称设置为DAL.SqlServerDAL.dll ,但是两者内部的类名、方法名以及命名空气名称完全一样。也就是说,比如class:OracleDAL有一个 Insert方法,那么就将他的类名称改成DAL,Insert名称不变(如果标示了如OracleInsert,最好改成与数 据库不相关的名称);而class:SqlServerDAL也同样将类名改成DAL,外部方法需要和OracleDAL一直。这 样一来,我们同时引用两个dll会报错,我们只能引用一个dll,也就是我们切换数据库的时候只用替换一 下dll就可以了,不必用反射来了,由此大家也能看到冗余。但是仍然可以优化,理想的情况下,可以抽 出一个中间的dll(DAL.dll)来封装两者相同的代码以及标准接口,而DAL.OracleDAL.dll和 DAL.SqlServerDAL.dll都依赖并遵循于DAL.dll,这样能规范约束并且减少冗余。
二、实施:
通过反射达到无缝切换:更改数据库连接字符串+更改表示当前数据库的配置文件(一般都是如此做法) 。
通过标准+冗余到无缝切换:更改数据库连接字符串+更换dll。
三、简单示例:
1.DAL.Oracle.dll
1.1 OracleDAL.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OracleClient;
using Model;
namespace Data
{
//public class OracleDAL
public class DAL
{
public void Insert(IModel model)
{
OracleCommand cmd = new OracleCommand("connectionstring");
cmd.CommandText = "Insert into test(column1,column2) values (@column1,@column2)";
//cmd.Parameters
cmd.ExecuteNonQuery();
}
}
}