让一个软件系统同时支持多个多种数据库灵活配置,让客户可以任意配置各个核心数据库部分...
直接看下图, 图中表明的一些系统设计的思想出发点,接着我们看看具体的实现部分. 一个系统随时可以部署在多个电脑上进行负载均衡, 甚至一个系统同时连接3种种数据库或者更多数据库, 充分利用分工职责明确原则.
我们做软件项目的, 没办法要求银行不要用DB2, 也没办法要求政府不要用Oralce, 只能适应客户,跟着客户走. 其实我们自己是不想换来换去.
用到的C#技术有 : XML, 反射, 枚举, 遍历枚举, 接口, 默认参数, 函数重载等.
1: 首先需要让客户能灵活配置,我们需要把客户的配置放在XML文件里,以前水平差一些的时候喜欢把很多配置信息都放在数据库里,还有TXT文件文件里,现在水平相对提高了不少,都把配置文件放在XML文件里了.大体效果如下,把3个核心部分的数据库类型,数据库连接串都保存配置好.
![](/assets/blank.gif)
<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;"/>
![](/assets/blank.gif)
2: 专业客户可以直接修改文本的XML文件进行配置就可以了, 我们把配置页面抓个效果图出来.
3: 我们会在程序里,按枚举类型进行编程,这样容易符合强类型的编码
![](/assets/blank.gif)
// 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>
publicenum DataBaseType
{
Oracle,
SqlServer,
Access,
DB2,
MySql,
SQLite
}
}
![](/assets/blank.gif)
4: 我们还需要能把文本配置信息读取到后,能变成枚举类型的转换方法,参考代码如下:
![](/assets/blank.gif)
///<summary>
/// 数据库连接的类型判断
///</summary>
///<param name="dataBaseType">数据库类型</param>
///<returns>数据库类型</returns>
publicstatic 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
![](/assets/blank.gif)
5: 我们还需要在我们的程序里能灵活的,通过反射把用户配置好的书库读取出来,那我们还需要几个代码,为了方便调用各种核心数据库,我们提供一些现成的方法给客户会更好用一些.
![](/assets/blank.gif)
/// 业务数据库部分
///</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;
}
}
![](/assets/blank.gif)
6: 用反射调用的数据库的方法如下:
![](/assets/blank.gif)
// 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>
publicclass DbHelperFactory
{
///<summary>
/// 获取指定的数据库连接
///</summary>
///<param name="connectionString">数据库连接串</param>
///<returns>数据库访问类</returns>
publicstatic IDbHelper GetHelper(string connectionString)
{
DataBaseType dataBaseType = DataBaseType.SqlServer;
return GetHelper(dataBaseType, connectionString);
}
///<summary>
/// 获取指定的数据库连接
///</summary>
///<param name="dataBaseType">数据库类型</param>
///<param name="connectionString">数据库连接串</param>
///<returns>数据库访问类</returns>
publicstatic 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;
}
}
}
![](/assets/blank.gif)
转载于:https://blog.51cto.com/2347979/1197309
让一个软件系统同时支持多个多种数据库灵活配置,让客户可以任意配置各个核心数据库部分...相关推荐
- ZXing是一个开源Java类库用于解析多种格式的条形码和二维码
ZXing是一个开源Java类库用于解析多种格式的条形码和二维码 2014年05月07日 17:30:37 shine4j 阅读数 5677 blog迁移至:http://www.micmiu.com ...
- 一个接口同时支持 form 表单、form-data、json 的优雅写法
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7054441239839506446 最近重写个项目遇到个比较棘手的问题,老项 ...
- SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...
- 类 ArrayBlockingQueueE(一个由数组支持的有界阻塞队列。)
类型参数: E - 在此 collection 中保持的元素类型 所有已实现的接口: Serializable, Iterable<E>, Collection<E>, Blo ...
- 如何才能做好一个软件系统?
前言 在2014年左右,当时我们创业成立了一家软件公司,主要服务于中小客户,帮助客户实现业务的互联网化,我作为公司的技术负责人,一直负责公司里的技术管理+技术框架,我们主要做的产品形态以手机APP ...
- 基于netty实现一个简单的支持http和webSocket协议的的服务器(含xxl-job通信模块源码分析)
文章目录 背景 依赖 包结构 实现 WebSocketServer 业务handler WebSocketServerHandler 测试 xxl-job 源码中基于netty实现的http 总结 参 ...
- 自动采集头像大全微信小程序源码支持多分类多种流量主
这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...
- Linux Shell CentOS 写一个输出命令 支持颜色
文章目录 Linux Shell CentOS 写一个输出命令 支持颜色 相关阅读 1.代码 2.演示 Linux Shell CentOS 写一个输出命令 支持颜色 相关阅读 Linux Shell ...
- 如何让一个vue项目支持多语言(vue-i18n) 打包后依然可以修改语言包 并且修改后不需要重新打包
如何让一个vue项目支持多语言(vue-i18n) 1.安装:npm install vue-i18n --save 2.在main.js中引入vue-i18n import VueI18n from ...
- axios (get,post,put,delete),常用配置,全局配置,axios.create(config)配置一个新的axios
目录 axios 的理解和应用 axios 特点: 使用 axios 发 ajax请求 1. 发送 GET 请求 axios get完整版: axios get精简版: axios get请求发送时携 ...
最新文章
- 几则与西门子相关的消息
- router路由react_使用React Router在React中受保护的路由
- 读书笔记-恰到好处的幸福
- python3读取excel数据-python3 读取Excel表格中的数据
- Linux 将文件夹下的所有文件复制到另一个文件里
- 创建springboot出现error:connection timed out创建springboot报错显示连接超时解决方案
- Android Studio failed to resolve .....
- php滚动公告源码,JavaScript_jquery垂直公告滚动实现代码,复制代码 代码如下: !DOCTYPE - phpStudy...
- python pandas缺失值处理_Pandas之缺失值处理
- 不到 1000 元,你的所有隐私竟然都能随便查!!!
- 微信小程序云开发教程-微信小程序的JS基础-事件响应与视图层数据获取
- json对象转换成字符串 java_Json对象与Json字符串的转化、JSON字符串与Java对象的转换(转)...
- App自动化测试工具Airtest
- html多重阴影,求问:CSS3多重阴影效果实现的问题。为什么没有任何的效果,怎么改颜色都没用。...
- win10计算机联接多个网络,win10两台电脑连接局域网的详细操作教程
- 现代魔法学院——闲聊哈希表及哈希表的链地址法实现
- markdown 入门 - 这样就够用了
- Graphql是什么
- Jmeter - webSocket 压力测试笔记
- 35.给定的字符串中字母顺序前移,其他字符顺序后移。
热门文章
- PHP什么函数获取日期,php getdate()函数获取日期信息实例详解
- mycat是什么_MyCat
- rk3399_android7.1读写sn和eth mac地址
- 【BZOJ1226】学校食堂(动态规划,状态压缩)
- JavaScript数组api简单说明
- inittab 分析
- 20145302张薇 《信息安全系统设计基础》第0周学习总结
- template 不能分别在.h和.cpp中定义模板
- FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(
- 博客开通了-里面有秘密哦