PDF.NET不使用DalFactory和IDAL支持多种数据库应用方案

news/2024/6/29 11:07:19 标签: 数据库, 框架, sql, dataset, interface, orm
 

MS的PetShop示例应用程序的“多层架构”被很多.NET开发人员奉为经典的架构,我以前做的项目团队的Leader也是照搬它的,甚至来到现在这个公司后,好几个新来的同事建解决方案也是照搬PetShop的架构,可见PetShop对大家影响之深。

下面是PetShop 3.0的架构图:

为了支持多数据库应用,在DAL中,定义了DAL Interface和DAL Factory,下面这个图也许跟简单直观一些

 

通过这个图大家都能够明白,引入DalFactory和IDAL就是为了系统支持不同的数据库

PDF.NET数据开发框架采用了完全不同的方式,先看看它的分层架构图:

如果在DAL中没有某种数据库特有的SQL语句,DalFactory是不需要的,当然IDAL也不需要了。例如ORM操作,一般不会用到数据库的特性,发出的都是标准的SQL语句。PDF.NET数据开发框架的ORM操作是通过EntityQuery和OQL表达式来实现,在具体支持不同数据库的时候,底层采用的是反射工厂模式:

 

  ///   <summary>
        
///  创建公共数据访问类的实例
        
///   </summary>
        
///   <param name="providerAssembly"> 提供这程序集名称 </param>
        
///   <param name="providerType"> 提供者类型 </param>
        
///   <returns></returns>
         public   static  AdoHelper CreateInstance(  string  providerAssembly,  string  providerType )
        {
            Assembly assembly 
=  Assembly.Load( providerAssembly );
            
object  provider  =  assembly.CreateInstance( providerType );

            
if ( provider  is  AdoHelper )
            {
                
return  provider  as  AdoHelper;
            }
            
else
            {
                
throw   new  InvalidOperationException( " 当前指定的的提供程序不是 AdoHelper 抽象类的具体实现类,请确保应用程序进行了正确的配置(如connectionStrings 配置节的 providerName 属性)。 " );
            }
        }

 

这样只需要在配置文件中进行配置,指明采用何种数据库即可,这是框架脱离DalFactory+IDAL的第一种方式。


当然,为了高效的使用某种数据库的特性,有可能会写一些数据库特性的SQL,要使得系统支持不同的数据库,还得使用DalFactory,因此得定义IDAL。

 

PDF.NET数据开发框架为了解决这个问题,将所有的SQL语句写在一个配置文件SqlMap.config中,使用工具自动生成框架的DAL代码,即SqlMapDAL,不同的数据库系统使用不同的SqlMap.config文件即可,不需要替换SqlMapDAL,因此,框架再也不需要定义DalFactory和IDAL了,这应该算是第二种方式。
下图是根据SqlMap自动生成代码并运行的流程:

 

在SqlMap中,可以将结果映射成DataSet,实体类和实体类集合,也可以是单值类型,可以完成各种复杂的SQL操作,可以处理存储过程。系统将SQL语句中的参数映射成DAL代码中方法的参数,使得操作非常直观高效,并且没有SQL注入的问题。

 

PDF.NET数据开发框架通过自己的ORM(EntityQuery+OQL)结合SQL-MAP的方式,使得喜欢OO的人和喜欢SQL的人都能找到自己需要的,便利性和灵活性都能够兼得。


http://www.niftyadmin.cn/n/963426.html

相关文章

javascript 装逼风格(部分)

1.用感叹号将非布尔值转化为布尔值&#xff08;感叹号可以把所有的东西都变成布尔值&#xff09; var str "abc"; console.log(!str);2.双波浪号的妙用&#xff0c;将内容转化为数字,或者小数取整&#xff08;双波浪号的取整是直接去掉小数点后的小数&#xff09; v…

64位LabVIEW64可以调用32位的DLL吗

64位LabVIEW64可以调用32位的DLL吗 在用64位的LabVIEW中调用库函数节点时选择一个32位DLL时&#xff0c;得到一个对话框提示&#xff1a; ​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​ 为什么会显示这个错误&#xff1f;可以在64位LabV…

ASP.net 路径问题详解

各位有没有碰到在日常工作中经常在路径设置的时候把 "~/ 、./ 、../ 、 / 、http://www.cnblogs.com/"这些符号搞混搞乱了&#xff1f;偶尔还会因路径的问题郁闷了半天 还以为是程序上出了问题了。以下我是转自--脚本之家 里的一篇技文&#xff0c;略作修改&#xff…

LabVIEW开发汽车惯性导航系统测试

LabVIEW开发汽车惯性导航系统测试 惯性导航单元的测试解决方案由两部分组成&#xff1a; 测试台&#xff1a;它由仪器仪表&#xff0c;测试机架和线束组成。对于仪器仪表&#xff0c;采用双端口电源来为设备和基站供电&#xff0c;而多功能DAQ则使用多路复用器通过RS232接口进…

广东工业大学研究生计算机专业课,走进广东工业大学最热门的专业,考研难度如何?...

本期聚问答让我们走进广东工业大学计算机专业。提及计算机专业&#xff0c;可谓是现今最火热的工科专业。随着互联网行业的高速发展&#xff0c;计算机专业相关人才需求紧缺。相较于其他行业&#xff0c;互联网行业给予毕业生的薪酬待遇更为优渥&#xff0c;甚至超过了金融行业…

LabVIEW开发电机驱动单元通用测试系统

LabVIEW开发电机驱动单元通用测试系统 为各种航空航天公司的电机驱动控制系统开发通用的硬件和软件架构。由于NI PXIe硬件的广泛功能&#xff0c;它支持最大带宽24GB/s的总带&#xff0c;而软件可以适应各种测量和自动化功能。因此被视为为需要单一测试的通用解决方案。 解决…

TableviewCell在编辑模式下的多选按钮自定义

在编辑模式下&#xff0c;如果我们启用多选模式&#xff0c;系统则会为我们配上原生的选择按钮。但这往往是不符合UI要求的&#xff0c;如此我们便需要对按钮进行自定义。 不过很可惜&#xff0c;这个按钮属性不是暴露在外的&#xff0c;那我们需要用比较暴力的方法——将它循环…

委托与事件以及应用

因为最近再带两个实习的朋友~ 他们在理解委托这块 不明白能用来做什么 对这块理解的不好 更不用说委托扩展来的 拉姆达表达式 事件等了~ 但是这些很重要 在MVC EF4.1 里 都会有很多拉姆达表达式的影子 在做组件开发 用户控件开发 事件的运用 一定也是少不了的 稍微深入点儿…