前言
當我們提到設計數據庫無縫切換的時候,經常用到的辦法就是用反射,連微軟自帶的例子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();
}
}
}