直接看下图, 图中表明的一些系统设计的思想出发点,接着我们看看具体的实现部分. 一个系统随时可以部署在多个电脑上进行负载均衡, 甚至一个系统同时连接3种种数据库或者更多数据库, 充分利用分工职责明确原则.
我们做软件项目的, 没办法要求银行不要用DB2, 也没办法要求政府不要用Oralce, 只能适应客户,跟着客户走. 其实我们自己是不想换来换去.
用到的C#技术有 : XML, 反射, 枚举, 遍历枚举, 接口, 默认参数, 函数重载等.
1: 首先需要让客户能灵活配置,我们需要把客户的配置放在XML文件里,以前水平差一些的时候喜欢把很多配置信息都放在数据库里,还有TXT文件文件里,现在水平相对提高了不少,都把配置文件放在XML文件里了.大体效果如下,把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: 我们还需要能把文本配置信息读取到后,能变成枚举类型的转换方法,参考代码如下:
/// <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: 我们还需要在我们的程序里能灵活的,通过反射把用户配置好的书库读取出来,那我们还需要几个代码,为了方便调用各种核心数据库,我们提供一些现成的方法给客户会更好用一些.
/// 业务数据库部分
/// </summary>
protected IDbHelper DbHelper
{
get
{
if (dbHelper == null)
{
// 当前数据库连接对象
dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.BusinessDbType, BaseSystemInfo.BusinessDbConnection);
}
return dbHelper;
}
}
private IDbHelper userCenterDbHelper = null;
/// <summary>
/// 用户中心数据库部分
/// </summary>
protected IDbHelper UserCenterDbHelper
{
get
{
if (userCenterDbHelper == null)
{
// 当前数据库连接对象
userCenterDbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection);
}
return userCenterDbHelper;
}
}
private IDbHelper workFlowDbHelper = null;
/// <summary>
/// 工作流数据库部分
/// </summary>
protected IDbHelper WorkFlowDbHelper
{
get
{
if (workFlowDbHelper == null)
{
// 当前数据库连接对象
workFlowDbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.WorkFlowDbType, BaseSystemInfo.WorkFlowDbConnection);
}
return workFlowDbHelper;
}
}
6: 用反射调用的数据库的方法如下:
// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd.
// -----------------------------------------------------------------
using System.Reflection;
namespace DotNet.DbUtilities
{
using DotNet.Utilities;
/// <summary>
/// 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
///
/// <author>
/// <name> JiRiGaLa </name>
/// <date> 2011.10.09 </date>
/// </author>
/// </summary>
public class DbHelperFactory
{
/// <summary>
/// 获取指定的数据库连接
/// </summary>
/// <param name="connectionString"> 数据库连接串 </param>
/// <returns> 数据库访问类 </returns>
public static IDbHelper GetHelper( string connectionString)
{
DataBaseType dataBaseType = DataBaseType.SqlServer;
return GetHelper(dataBaseType, connectionString);
}
/// <summary>
/// 获取指定的数据库连接
/// </summary>
/// <param name="dataBaseType"> 数据库类型 </param>
/// <param name="connectionString"> 数据库连接串 </param>
/// <returns> 数据库访问类 </returns>
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;
}
}
}
About
吉日嘎拉(蒙古语为吉祥如意),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:jirigala_bao@hotmail.com
通用权限管理模块的严谨设计定位、精心编码实现、不断维护推广、持续优化改进,主要是为了实现一个可以高度重复利用劳动成果的工具软件并×××给所需的人们,另想成为国人值得骄傲的知名软件功能模块。
可供国内管理类开发人员在日常工作中进行灵活二次开发利用的模块,开发管理类软件的必备工具之一,我们的目标就是让程序员早点儿回家休息。
转载于:https://blog.51cto.com/jirigala/812752