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

   直接看下图, 图中表明的一些系统设计的思想出发点,接着我们看看具体的实现部分. 一个系统随时可以部署在多个电脑上进行负载均衡, 甚至一个系统同时连接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文件进行配置就可以了, 我们把配置页面抓个效果图出来.

扫描二维码关注公众号,回复: 6469572 查看本文章

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

     ///   <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>
     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;
        }
    }
}

 

转载于:https://my.oschina.net/iwenr/blog/227943

猜你喜欢

转载自blog.csdn.net/weixin_33721344/article/details/91674354