Winform开发框架中贯彻强数据库类型切换以及分拆数据库的支撑

每当不少施用系统间,虽然一般用相同种植数据库运行,但是由各种场面的得,可能工作系统会部署于不同品种的数据库及,如果开的系能够挺方便支持多数据库的切换,那可为咱减少过多烦心,同时加强系统的适应性和强壮型。还有一样栽状态,由于事务数据库的穿梭膨胀或者福利数据库的切割隔离,有时候为会见管不同之事务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此当一个网里,同时利用2单或以上之数据库的气象为是一对。针对当下半种植情况,本文介绍于我之Winform开发框架(也以我的旁框架),如何具体处理当下半单问题之。

于自家的各种开销框架内,底层都是运用同样种数据库的访方式,就是运了Enterprise
Library的数据库访问模块,这个是微软开源的企业应用模块,里面各种以模块,都堪称是支付之顶尖实践。当然利用内部的数据库访问模块,是挺宽泛的,这个数据库访问模块,可以由此部署的计支持多数据库的扭转。因此成到自我的Winform开发框架中,也很容易实现这种多数据库的方法处理。

Winform开发框架,常见的子模式,可以分成UI层、BLL层、DAL层、IDAL层、Entity层、公用类库层等等,B/S的Web开发框架为是供类似的架模式,它们只是Web界面层有所不同,这样即使于咱们提供了一个统一性的付出模式,使得开发起来更为快捷,统一性更好。框架界面层以下的架构设计图如下所示。

图片 1

1、支持多数据库的安

1)数据库访问基类的了解

以介绍支持多数据库的模式,我们得事先来打听下所有框架的层次结构。

AbstractBaseDAL是抽象了有数据库实现之顶尖基类。

BaseDALSQL是对准SqlServer数据库有调整基类(很粗的调整)。

BaseDALSQLite是针对性Sqlite数据库的组成部分调整基类(很有点的调动)。

BaseDALMySql是对MySqlite数据库的有的调整基类(很有点之调动)。

BaseDALAccess是指向Access数据库的片段调整基类(很有些之调)。

IBaseDAL是具基础数据库访问类的接口。

数量访问接口实现交汇(如Customer)和接口定义层(ICustomer)一样,都来一个基类,如基于SqlServer实现的基类为BaseDALSQL,这个基于SqlServer的数量访问基类,它吧是连续自一个最佳基类(大多数底落实以此间)AbstractBaseDAL。他们中间的继续关系如下所示

图片 2

设若我辈才在路工程的觊觎中看到,BaseDALSQL、IBaseDAL、AbstractBaseDAL这些类库由于有着很怪之通用性,为了削减在不同的种蒙进行复制导致维护问题,因此我们凡事将这些时下到的基类或者接口,抽取到一个单独的类库里面,为了和平凡的DotNET公用类库命名进行区分(WHC.Framework.Commons),我们拿它们命名吧WHC.Framework.ControlUtil。

2)多数据库的代码实现

为促成多数据库的支撑,我们要在部署文件里读取相关的配备,看现实是结构那种该数据库的,然后开展初始化不同的次序集类,从而实现调用不同数据库类型的数据库访问类。

以BaseBLL的Init函数里面的贯彻代码如下所示。

            #region 根据不同的数据库类型,构造相应的DAL层
            AppConfig config = new AppConfig();
            string dbType = config.AppConfigGet("ComponentDbType");
            if (string.IsNullOrEmpty(dbType))
            {
                dbType = "sqlserver";
            }
            dbType = dbType.ToLower();

            string DALPrefix = "";
            if (dbType == "sqlserver")
            {
                DALPrefix = "DALSQL.";
            }
            else if (dbType == "access")
            {
                DALPrefix = "DALAccess.";
            }
            else if (dbType == "oracle")
            {
                DALPrefix = "DALOracle.";
            }
            else if (dbType == "sqlite")
            {
                DALPrefix = "DALSQLite.";
            }
            else if (dbType == "mysql")
            {
                DALPrefix = "DALMySql.";
            }
            #endregion

            this.dalName = bllFullName.Replace(bllPrefix, DALPrefix);//替换中级的BLL.为DAL.,就是DAL类的全名
            baseDal = Reflect<IBaseDAL<T>>.Create(this.dalName, dalAssemblyName);//构造对应的DAL数据访问层的对象类

当切实可行的作业对象的调用的时段,我们无明白它有血有肉是调整用哪个数据库的拍卖接近进行拍卖的,只待调用它的基础接口就可以了,如下是界面层的有的调用代码。

            //删除关联的附件
            if (!string.IsNullOrEmpty(ids))
            {
                string[] idArray = ids.Split(',');
                foreach (string id in idArray)
                {
                    InformationInfo info = BLLFactory<Information>.FindByID(id);
                    if (info != null && !string.IsNullOrEmpty(info.Attachment_GUID))
                    {
                        BLLFactory<FileUpload>.Instance.DeleteByAttachGUID(info.Attachment_GUID);
                    }
                }
            }

以切切实实的布文件之中,我们便可以根据需要配备好有关的数据库了。

据悉Enterprise Library的布,我们如果制定了<dataConfiguration
defaultDatabase=”sqlserver”>,那么就算会获得sqlServer的节点,而代码通过解析ComponentDbType配置起,就足以组织对应之数据库访问对象了。两者合就好对获取到拍卖对象,并打响拍卖数据库的看。

<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/>
  </configSections>
  <connectionStrings>
    <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=MVCWebMis;Integrated Security=SSPI"/>
    <add name="access" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ComponentData.mdb;User ID=Admin;Jet OLEDB:Database Password=;"/>
    <add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\ComponentData.db;Version=3;"/>
    <add name="oracle" providerName="System.Data.OracleClient" connectionString="Data Source=whcdb;User ID=whc;Password=whc"/>
  </connectionStrings>
  <dataConfiguration defaultDatabase="sqlserver">
    <providerMappings>
      <add databaseType="EntLibContrib.Data.SQLite.SQLiteDatabase, EntLibContrib.Data.SqLite" name="System.Data.SQLite"/>
    </providerMappings>
  </dataConfiguration>

  <appSettings>
    <!--组件的数据库类型:access、sqlserver、sqlite等-->
    <add key="ComponentDbType" value="sqlserver"/>

 

2、支持分拆不同数据库的安

点介绍的法门,一次性只能看一个数据库,因此默认在代码构造数据库访问对象的早晚,是由此下的代码进行的。

Database db = DatabaseFactory.CreateDatabase();

诸如此类每次就见面沾defaultDatabase设置的数据库进行布局,如果我们在一个系统内,同时支持多只数据库的看,那么我们应有什么处理也。

在框架的基类AbstractBaseDAL里面,我们针对结构数据库的代码进行了打包。

        /// <summary>
        /// 根据配置数据库配置名称生成Database对象
        /// </summary>
        /// <returns></returns>
        protected virtual Database CreateDatabase()
        {
            Database db = null;
            if (string.IsNullOrEmpty(dbConfigName))
            {
                db = DatabaseFactory.CreateDatabase();
            }
            else
            {
                db = DatabaseFactory.CreateDatabase(dbConfigName);
            }
            return db;
        }

要是每个DAL层都见面延续自AbstractBaseDAL,这样也就足以经在DAL层指定dbConfigName进行动不同之数据库的了。

而是这样问题出现了,假如我们发5单例外种类(SqlServer、Oracle、Mysql、Access、Sqlite)的数据库的DAL层,那么每个DAL层的落实类似都如描写有代码,这样很不便宜,那么是否好管其抽象到BLL层,这样就写一潮配置就可了,这个思路非常好,我们具体来看望哪贯彻。

1)在IBaseDAL层定义接口

    /// <summary>
    /// 数据访问层的接口
    /// </summary>
    public interface IBaseDAL<T> where T : BaseEntity
    {
        /// <summary>
        /// 设置数据库配置项名称
        /// </summary>
        /// <param name="dbConfigName">数据库配置项名称</param>
        void SetDbConfigName(string dbConfigName);

        .............
    }

2、在AbstractBaseDAL添加默认实现代码

    /// <summary>
    /// 数据访问层的超级基类,所有数据库的数据访问基类都继承自这个超级基类,包括Oracle、SqlServer、Sqlite、MySql、Access等
    /// </summary>
    public abstract class AbstractBaseDAL<T> where T : BaseEntity, new()
    {
        /// <summary>
        /// 设置数据库配置项名称
        /// </summary>
        /// <param name="dbConfigName">数据库配置项名称</param>
        public virtual void SetDbConfigName(string dbConfigName)
        {
            this.dbConfigName = dbConfigName;
        }

        ....................
}

3、在BaseBLL里面的Init函数进行调用设置处理

        /// <summary>
        /// 参数赋值后,初始化相关对象
        /// </summary>
        /// <param name="bllFullName">BLL业务类的全名(子类必须实现),子类构造函数传入this.GetType().FullName</param>
        /// <param name="dalAssemblyName">数据访问层程序集的清单文件的文件名,不包括其扩展名。设置为NULL或默认为Assembly.GetExecutingAssembly().GetName().Name</param>
        /// <param name="bllPrefix">BLL命名空间的前缀(BLL.)</param>
        /// <param name="dbConfigName">数据库配置项名称</param>
        protected void Init(string bllFullName, string dalAssemblyName = null, string bllPrefix = "BLL.")
        {
            .............
            baseDal.SetDbConfigName(dbConfigName); //设置数据库配置项名称
        }

4、在具体BLL层的事情类似进行初始化处理。

    /// <summary>
    /// 政策法规公告动态
    /// </summary>
    public class Information : BaseBLL<InformationInfo>
    {
        public Information() : base()
        {
            base.Init(this.GetType().FullName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name, "BLL.", "annotherConfig" );
        }

这么设置后,我们具体调用的代码不转换,但是指定工作的数据库访问已经运用了特定的安排起名称了,如果安排起不存,那么还是会获得默认的布置起进行处理了。

由此这样的落实步骤,我们不怕能够实现在一个事务体系中,分拆不同的数据库,进行联合管理,而且还要休见面增多额外的调用难度,对于咱们广大业务表,这种框架的处理方式
,应该是对的。

 

相关文章