直接看下圖, 圖中表明的一些系統設計的思想出發點,接着我們看看具體的實作部分. 一個系統随時可以部署在多個電腦上進行負載均衡, 甚至一個系統同時連接配接3種種資料庫或者更多資料庫, 充分利用分工職責明确原則.
我們做軟體項目的, 沒辦法要求銀行不要用DB2, 也沒辦法要求政府不要用Oralce, 隻能适應客戶,跟着客戶走. 其實我們自己是不想換來換去.
用到的C#技術有 : XML, 反射, 枚舉, 周遊枚舉, 接口, 預設參數, 函數重載等.
1: 首先需要讓客戶能靈活配置,我們需要把客戶的配置放在XML檔案裡,以前水準差一些的時候喜歡把很多配置資訊都放在資料庫裡,還有TXT檔案檔案裡,現在水準相對提高了不少,都把配置檔案放在XML檔案裡了.大體效果如下,把3個核心部分的資料庫類型,資料庫連接配接串都儲存配置好.
<!-- ================== 3:資料庫連接配接相關配置 ================== -->
<add key="UserCenterDbType" value="SqlServer" Options="SqlServer,Oracle,MySql,DB2,SQLite,Access"/>
<add key="BusinessDbType" value="SqlServer" Options="SqlServer,Oracle,MySql,DB2,SQLite,Access"/>
<add key="WorkFlowDbType" value="SqlServer" Options="SqlServer,Oracle,MySql,DB2,SQLite,Access"/>
<!-- 是否開啟資料庫連接配接加密-->
<add key="EncryptDbConnection" value="False" />
<add key="UserCenterDbConnection" value="Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@sa;"/>
<add key="BusinessDbConnection" value="Data Source=localhost;Initial Catalog=ProjectV32;User Id = sa ; Password = Password@sa;"/>
<add key="WorkFlowDbConnection" value="Data Source=localhost;Initial Catalog=WorkFlowV36;User Id = sa ; Password = Password@sa;"/>
2: 專業客戶可以直接修改文本的XML檔案進行配置就可以了, 我們把配置頁面抓個效果圖出來.
3: 我們會在程式裡,按枚舉類型進行程式設計,這樣容易符合強類型的編碼
//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd.
namespace DotNet.Utilities
{
/// <summary>
/// DataBaseType
/// 有關資料庫連接配接類型定義。
///
/// 修改紀錄
/// 2011.02.22 版本:3.1 JiRiGaLa 轉移檔案位置,還是不換為好。
/// 2007.04.14 版本:3.0 JiRiGaLa 檢查程式格式通過,不再進行修改主鍵操作。
/// 2006.11.17 版本:2.1 JiRiGaLa 變量命規範化。
/// 2006.04.18 版本:2.0 JiRiGaLa 重新調整主鍵的規範化。
///
/// 版本:3.0
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2007.04.14</date>
/// </author>
/// </summary>
public enum DataBaseType
{
Oracle,
SqlServer,
Access,
DB2,
MySql,
SQLite
}
}
4: 我們還需要能把文本配置資訊讀取到後,能變成枚舉類型的轉換方法,參考代碼如下:
#region public static DataBaseType GetDataBaseType(string dataBaseType)
/// <summary>
/// 資料庫連接配接的類型判斷
/// </summary>
/// <param name="dataBaseType">資料庫類型</param>
/// <returns>資料庫類型</returns>
public static DataBaseType GetDataBaseType(string dataBaseType)
{
DataBaseType returnValue = DataBaseType.SqlServer;
foreach (DataBaseType dbType in Enum.GetValues(typeof(DataBaseType)))
{
if (dbType.ToString().Equals(dataBaseType))
{
returnValue = dbType;
break;
}
}
return returnValue;
}
#endregion
5: 我們還需要在我們的程式裡能靈活的,通過反射把使用者配置好的書庫讀取出來,那我們還需要幾個代碼,為了友善調用各種核心資料庫,我們提供一些現成的方法給客戶會更好用一些.
/// 業務資料庫部分
protected IDbHelper DbHelper
get
if (dbHelper == null)
// 目前資料庫連接配接對象
dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.BusinessDbType, BaseSystemInfo.BusinessDbConnection);
return dbHelper;
private IDbHelper userCenterDbHelper = null;
/// 使用者中心資料庫部分
protected IDbHelper UserCenterDbHelper
if (userCenterDbHelper == null)
userCenterDbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection);
return userCenterDbHelper;
private IDbHelper workFlowDbHelper = null;
/// 工作流資料庫部分
protected IDbHelper WorkFlowDbHelper
if (workFlowDbHelper == null)
workFlowDbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.WorkFlowDbType, BaseSystemInfo.WorkFlowDbConnection);
return workFlowDbHelper;
6: 用反射調用的資料庫的方法如下:
using System.Reflection;
namespace DotNet.DbUtilities
using DotNet.Utilities;
/// DbHelperFactory
/// 資料庫服務工廠。
/// 2011.10.09 版本:2.1 JiRiGaLa 改進直接用資料庫連接配接就可以打開連接配接的方法。
/// 2011.10.08 版本:2.0 JiRiGaLa 支援多類型的多種資料庫。
/// 2011.09.18 版本:1.4 JiRiGaLa 整理代碼注釋。
/// 2011.03.30 版本:1.3 JiRiGaLa 增加資料庫連串的構造函數。
/// 2009.07.23 版本:1.2 JiRiGaLa 每次都擷取一個新的資料庫連接配接,解決并發錯誤問題。
/// 2008.09.23 版本:1.1 JiRiGaLa 優化改進為單執行個體模式。
/// 2008.08.26 版本:1.0 JiRiGaLa 建立資料庫服務工廠。
/// 版本:2.1
/// <date>2011.10.09</date>
public class DbHelperFactory
/// 擷取指定的資料庫連接配接
/// <param name="connectionString">資料庫連接配接串</param>
/// <returns>資料庫通路類</returns>
public static IDbHelper GetHelper(string connectionString)
DataBaseType dataBaseType = DataBaseType.SqlServer;
return GetHelper(dataBaseType, connectionString);
public static IDbHelper GetHelper(DataBaseType dataBaseType = DataBaseType.SqlServer, string connectionString = null)
// 這裡是每次都擷取新的資料庫連接配接,否則會有并發通路的問題存在
string dbHelperClass = BaseBusinessLogic.GetDbHelperClass(dataBaseType);
IDbHelper dHelper = (IDbHelper)Assembly.Load(BaseSystemInfo.DbHelperAssmely).CreateInstance(dbHelperClass, true);
if (!string.IsNullOrEmpty(connectionString))
dHelper.ConnectionString = connectionString;
return dHelper;
将權限管理、工作流管理做到我能力的極緻,一個人隻能做好那麼很少的幾件事情。
吉日嘎拉(蒙古語為吉祥如意),2000年畢業于黑龍江大學計算機系軟體專業,目前定居杭州,典型的IT軟體土鼈一個,外号“軟體包工頭”。
通用權限管理系統元件(GPM - General Permissions Manager)自2003年開始釋出,目前是國内注冊使用者和免費盜版使用者最多的權限管理系統,是各種資訊管理系統開發中徹底的權限解決方案。本元件支援多種主流資料庫(Oracle、sqlsever、db2、mysql),功能強大,使用友善,代碼簡潔,思路嚴謹,被廣大支援者稱為權限管理系統中的“走火入魔級權限管理系統”。
精心維護通用權限管理系統元件(GPM - General Permissions Manager)有8年多,3年的不斷推廣,20萬行經典的業務邏輯積累,經過上萬次的調試修正,經曆了四百個付費客戶,上百軟體公司的實戰開發。
11年以上開發經驗,外企工作5年,上市公司3年,獨立經營軟體公司2年,主持研發部門管理工作4年以上。
将權限管理、工作流做到我能力的極緻,一個人隻能做好那麼很少的幾件事情。
QQ:252056973,Mail:[email protected]
通用權限管理子產品的嚴謹設計定位、精心編碼實作、不斷維護推廣、持續優化改進,主要是為了實作一個可以高度重複利用勞動成果的工具軟體并有償提供給所需的人們,另想成為國人值得驕傲的知名軟體功能子產品。
可供國内管理類開發人員在日常工作中進行靈活二次開發利用的子產品,開發管理類軟體的必備工具之一,我們的目标就是讓程式員早點兒回家休息。
本文轉自jirigala_bao 51CTO部落格,原文連結:http://blog.51cto.com/jirigala/812752