重温Petshop 谈谈对三层架构的理解--兼发布一个通用的数据访问控件(oracle免装客户端)

转载 2012年03月21日 17:13:59
编写这个组件的需求灵感来自于看了某个产品(企业应用系统)研发项目的源码,该产品为了同时支持sql server 和oracle,

照搬了微软的 petshop的代码作为系统架构,petshop相信很多.net程序员都非常熟悉了,里面所展示的三层架构大意是这样的

UI层,BLL层,DAL层,UI层使用BLL层的服务对象,BLL使用DAL层的服务对象,其中BLL层对DAL层的引用使用的是接口,通过配置文件动态加载指定的DAL实现,

DAL通过使用不同的数据库ADO.NET组件,调用不同的SQL语句,如 Oracle DAL 使用了System.Data.OracleClient下的OracleConnection,OracleCommand...,

SQLServer DAL使用了System.Data.SqlClient下的SqlConnection,SqlCommand等,实现了针对不同数据库的支持。

于是,这个产品的开发人员,都是这么个过程编写代码的,首先,打开UI层,当需要对数据进行某项操作时,比如 GetProduct(int id) 编写好2条sql语句,1条sql server版(select * from product where id = @id),放置于一个专门存放sql server的sql语句的xml文件中,一条oracle版的(select * from product where id =:id),放置于一个专门存放Oracle的sql语句的xml文件中,然后在IDAL层定义方法接口,同时在SQL Server DAL和Oracle DAL各 定义一个实现方法执行该sql,

大致如下

 idal:

public interface  IProduct

{

 product  GetProduct(int id);

}

 

sqlserver dal:

public class ProductDal: IProduct 

 publilc product GetProduct(int id)

{

  reuturn SqlHelper.ExecuteDataSet(sqlserver.sql)...

}

}

oracle dal:

public class ProductDal: IProduct 

  publilc product GetProduct(int id)

{

  reuturn oracleHelper.ExecuteDataSet(sqlserver.sql)...

}

}

SQLhelper 代码大致如下

 public ExecuteDataSet(string sql)

{

  using(SqlConnection conn = new SqlConnection)

 {

.....

}  

}

Oraclehelper 代码大致如下

 public ExecuteDataSet(string sql)

{

  using(OracleConnection conn = new SqlConnection)

 {

.....

}  

}

然后再在BLL层定义方法,

idal = DALFactory.DataAccess.CreateProduct();  (通过配置文件指定返回实现的DAL)

 publilc product GetProduct(int id)

{

  reuturn idal.GetProduct(id);

}

至此,UI层终于可以调用BLL的方法了。结果就是 DAL层庞大无比,有无数个类和方法,而BLL呢,没有实质性代码,简直就是为了达到三层架构而拼凑出来似的,纯粹就是为了"三层"而"三层"。

事实上,我认为,数据层应该提供的是数据服务,即每个数据库对象(表,视图,存储过程)的crud,而和业务逻辑无关,而BLL通过调用这些数据服务,形成UI层需要的数据,并返回给UI,而UI层,只负责响应界面上用户的操作,对数据的加工处理,则交给BLL完成,这才是三层的分工职责。

像上面误解三层架构的地方其一是 没有真正理解数据访问层的负责提供数据服务的概念,实质上是把ui层需要什么都数据,都交给数据访问层去实现,petshop作为一个示例代码项目,为了通俗易懂,bll写的比较简单,却给一些人造成了误解,以为bll就是一个代理层。

其二是如果为了使产品适应不同的数据库,这种架构未免太罗嗦,首先要定义接口,然后针对sql server写一个实现方法, 然后针对oracle再写一个实现方法, 方法内容大多数情况下一模一样的,实际上微软的ADO.net组件里早就提供了一组通用的抽象基类,位于System.Data.Comm下,DbConnection,DbCommand...,  System.Data.SqlCient和System.Data.OracleClient下的SqlConnection,OracleConnection均继承于对应的抽象基类,微软设置连创建这些组件的工厂类都建立好了,DbProviderFacoty,实现子类SqlClientFactory,OracleClientFactory...,事实上,我们完全可以用使用通用ADO.net组件来编写我们的

xxxDBHelper类,这样对于dal,无需使用接口,无需多个针对数据库的实现,

比如 

DBHelper:

 public ExecuteDataSet(string sql)

{

  using(DbConnection conn = DbProviderFacory.Instance.CreateConnection())

 {

....

}

DAL里不必再考虑多个库的实现,直接

DBHelper.ExecuteDataSet(sql);

我们需要做的,无非就是在初始化的时候,创建指定的DbProviderFacory,实际上配置文件的数据库连接里就有

ProviderName这一项,就是用来指定DbProviderFacory(微软其实已经提供了我们所需要的一切),而在machine.config,已经内置了微软的针对不同数据库的DbProviderFacory,如SQL Server,Oracle,OleDb,ODBC等,

说得简单点,只要我们在配置文件的数据库连接配置里,填上连接字符串,填上ProviderName,我们就能根据

ProviderName得到我们的DbProviderFacory,然后通过DbProviderFacory创建我们执行sql需要的Connction,Command等ADO.net 对象,我们在代码中无须再关心数据库的异同。

所以,我编写了DBClient,里面主要就一个类,DataAccess,提供的功能类似于petshop里面的sqlHelper,oracleHelper,只不过我使用的DbConnection,DbCommand等,

使用起来很简单,

DataAccess dataAccess = new DataAccess(providerName, connstring);

dataAccess.ExecuteDataSet(sql)....

你的providerName指向的是oracle provider,就会创建出oracle的ado组件执行sql,指向sql server provider,则会创建出sql的ado组件执行sql。

另外,在oracle provider我使用了oracle官方的oracle.dataaccess.dll,不仅性能和稳定性比微软自己的system.data.oracleclient.dll强(微软已宣布停止了该组件的发布),而且运行时带上相关的dll,还能免装

oracle 的客户端。

免安装oracle客户端使用PLSQL

免安装oracle客户端使用PLSQL Oracle客户端挺招人烦的,部署连接它的应用通常需要先安装它的客户端,安装程序要求在目标机器上写注册表,假设你没有洁癖的话,你仍可能被下面的事情绊住:当你的...
  • rogelong
  • rogelong
  • 2016年04月23日 21:29
  • 5001

Oracle数据库搭建及PL/SQL连接(免安装客户端)

Oracle配置 Oracle数据库安装略。 如上图,新建完数据库后需要启动的服务:1、监听服务;2、实例服务,本文示例数据库:greendb 一、服务器端配置: 1、为实例配置监听,本文路径:E...
  • qq184377902
  • qq184377902
  • 2016年05月12日 19:24
  • 1177

WEB三层架构与MVC

MVC到底和WEB三层架构有啥关系?现在可以说对WEB三层架构和MVC之间的关系理出了头绪。此可谓教学相长。 先说说Web三层架构这个古老话题。地球人都知道web三层架构是指: ·      ...
  • vera514514
  • vera514514
  • 2013年04月08日 11:17
  • 1711

asp.net三层架构连接Oracle 11g详解

asp.net三层架构连接Oracle 11g 连接Oracle时使用微软的Oracle连接组件; 一 DAL层 using System; using System.Collectio...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年08月05日 13:45
  • 1240

新闻发布系统 (Asp.net 三层架构 )

2012年度课程设计---新闻发布系统(小结)
  • kg_second
  • kg_second
  • 2013年01月11日 16:35
  • 6825

delphi三层架构

这是我多年前在深圳工作时写的,现在都迁移来CSDN上,免的丢失了。       三层架构指的是界面,业务逻辑和数据存储分离,不是指物理上是否分离。       这样做的好处是层...
  • kangshijiu1
  • kangshijiu1
  • 2014年03月11日 00:11
  • 1495

【Java架构学习】MVC和三层架构的区别

其实这篇博客的重点不是介绍三层架构,是重点介绍MVC并帮助理解MVC。学了这么久MVC发现对它的理解还存在很多误区,今天就来好好整理一下MVC。     MVC即Model-View-Controll...
  • huanjileaimeidan
  • huanjileaimeidan
  • 2014年09月10日 14:41
  • 2249

Linux下安装绿色版Oracle客户端备忘录

环境及版本信息: 远程服务器- Redhat 6.4;Oracle 11g x64; ArcGIS Server 10.2; 本地机器- Windows 8.1开始安装 12c 和 11g...
  • kikitaMoon
  • kikitaMoon
  • 2015年05月26日 12:40
  • 3128

【转载】终于明白了!三层架构和MVC不是一个事!

又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了。因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联系到一起了。   这两个东西我接触有几年了,有一点体会,表...
  • qq1162195421
  • qq1162195421
  • 2016年05月09日 10:48
  • 2847

C#连接Oracle 11g 无需安装Oracle客户端

1.首先到Oracle网站上下载ODAC http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html 2.下载的文件解...
  • easyboot
  • easyboot
  • 2016年03月09日 14:08
  • 6567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重温Petshop 谈谈对三层架构的理解--兼发布一个通用的数据访问控件(oracle免装客户端)
举报原因:
原因补充:

(最多只允许输入30个字)