直接看下图, 图中表明的一些系统设计的思想出发点,接着我们看看具体的实现部分. 一个系统随时可以部署在多个电脑上进行负载均衡, 甚至一个系统同时连接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>
publicenum DataBaseType
   {
       Oracle,
       SqlServer,
       Access,
       DB2,
       MySql,
       SQLite
   }
}

4: 我们还需要能把文本配置信息读取到后,能变成枚举类型的转换方法,参考代码如下:

#region public static DataBaseType GetDataBaseType(string dataBaseType)
///<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

5: 我们还需要在我们的程序里能灵活的,通过反射把用户配置好的书库读取出来,那我们还需要几个代码,为了方便调用各种核心数据库,我们提供一些现成的方法给客户会更好用一些.

///<summary>
/// 业务数据库部分
///</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>
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;
       }
   }
}

转载于:https://blog.51cto.com/2347979/1197309

让一个软件系统同时支持多个多种数据库灵活配置,让客户可以任意配置各个核心数据库部分...相关推荐

  1. ZXing是一个开源Java类库用于解析多种格式的条形码和二维码

    ZXing是一个开源Java类库用于解析多种格式的条形码和二维码 2014年05月07日 17:30:37 shine4j 阅读数 5677 blog迁移至:http://www.micmiu.com ...

  2. 一个接口同时支持 form 表单、form-data、json 的优雅写法

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7054441239839506446 最近重写个项目遇到个比较棘手的问题,老项 ...

  3. SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.

    SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...

  4. 类 ArrayBlockingQueueE(一个由数组支持的有界阻塞队列。)

    类型参数: E - 在此 collection 中保持的元素类型 所有已实现的接口: Serializable, Iterable<E>, Collection<E>, Blo ...

  5. 如何才能做好一个软件系统?

    前言   在2014年左右,当时我们创业成立了一家软件公司,主要服务于中小客户,帮助客户实现业务的互联网化,我作为公司的技术负责人,一直负责公司里的技术管理+技术框架,我们主要做的产品形态以手机APP ...

  6. 基于netty实现一个简单的支持http和webSocket协议的的服务器(含xxl-job通信模块源码分析)

    文章目录 背景 依赖 包结构 实现 WebSocketServer 业务handler WebSocketServerHandler 测试 xxl-job 源码中基于netty实现的http 总结 参 ...

  7. 自动采集头像大全微信小程序源码支持多分类多种流量主

    这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...

  8. Linux Shell CentOS 写一个输出命令 支持颜色

    文章目录 Linux Shell CentOS 写一个输出命令 支持颜色 相关阅读 1.代码 2.演示 Linux Shell CentOS 写一个输出命令 支持颜色 相关阅读 Linux Shell ...

  9. 如何让一个vue项目支持多语言(vue-i18n) 打包后依然可以修改语言包 并且修改后不需要重新打包

    如何让一个vue项目支持多语言(vue-i18n) 1.安装:npm install vue-i18n --save 2.在main.js中引入vue-i18n import VueI18n from ...

  10. axios (get,post,put,delete),常用配置,全局配置,axios.create(config)配置一个新的axios

    目录 axios 的理解和应用 axios 特点: 使用 axios 发 ajax请求 1. 发送 GET 请求 axios get完整版: axios get精简版: axios get请求发送时携 ...

最新文章

  1. 几则与西门子相关的消息
  2. router路由react_使用React Router在React中受保护的路由
  3. 读书笔记-恰到好处的幸福
  4. python3读取excel数据-python3 读取Excel表格中的数据
  5. Linux 将文件夹下的所有文件复制到另一个文件里
  6. 创建springboot出现error:connection timed out创建springboot报错显示连接超时解决方案
  7. Android Studio failed to resolve .....
  8. php滚动公告源码,JavaScript_jquery垂直公告滚动实现代码,复制代码 代码如下: !DOCTYPE - phpStudy...
  9. python pandas缺失值处理_Pandas之缺失值处理
  10. 不到 1000 元,你的所有隐私竟然都能随便查!!!
  11. 微信小程序云开发教程-微信小程序的JS基础-事件响应与视图层数据获取
  12. json对象转换成字符串 java_Json对象与Json字符串的转化、JSON字符串与Java对象的转换(转)...
  13. App自动化测试工具Airtest
  14. html多重阴影,求问:CSS3多重阴影效果实现的问题。为什么没有任何的效果,怎么改颜色都没用。...
  15. win10计算机联接多个网络,win10两台电脑连接局域网的详细操作教程
  16. 现代魔法学院——闲聊哈希表及哈希表的链地址法实现
  17. markdown 入门 - 这样就够用了
  18. Graphql是什么
  19. Jmeter - webSocket 压力测试笔记
  20. 35.给定的字符串中字母顺序前移,其他字符顺序后移。

热门文章

  1. PHP什么函数获取日期,php getdate()函数获取日期信息实例详解
  2. mycat是什么_MyCat
  3. rk3399_android7.1读写sn和eth mac地址
  4. 【BZOJ1226】学校食堂(动态规划,状态压缩)
  5. JavaScript数组api简单说明
  6. inittab 分析
  7. 20145302张薇 《信息安全系统设计基础》第0周学习总结
  8. template 不能分别在.h和.cpp中定义模板
  9. FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(
  10. 博客开通了-里面有秘密哦