ASP.NET 常见参考项目的 UI、BLL 、Model 、 DAL 分析。2008-03-12 10:32<转载>


个人感觉数据访问层应该实现以下几个主要目的:

1) 分离业务层与数据层

2)屏蔽具体数据库的差异(如SQLServer、Oracle、OLEDB、ODBC等)

3)简化数据访问层的代码,经常写一些 Parameter 的设定是很无聊的事情)

先下载并研究了一下Enterprise Library 2.0 ,发现其中的Data Access Application Block有点复杂了,有近 40 个类文件,还需要引用 Configuration、Common、ObjectBuilder 等项目,本身就是一个很大的项目了... 个人觉得还不如上一个版本中的 SQLHelper 对象那么简单方便(Pet Shop 4.0 中的 DabaAccess 项目里就是用 OracleHelper和SQLHelper来实现的)

再来研究Pet Shop 4.0 ,其中主要对象层次一般是(假设Model是业务对象):

ModelInfo <- Model -> IDAL <- SQLServerDAL(或OracleDAL)

其中:

ModelInfo 是瘦的业务实体数据对象
Model 实现 ModelInfo 的管理(增、删、改、查询)等,调用 IDAL 来实现
IDAL 是数据访问层的接口定义
SQLServerDAL 是 IDAL 在 SQLServer 上的实现,如果是 Oracle,可以利用 OracleDAL 来实现
貌视还不错的结构,只是 DAL 层的里面的代码还是比较多,好多SQL、好多Parameter的操作

再看看 Visual Studio 2005 中带的"个人网站的初学者工具包"的数据访问代码,它只是简单在App_Code中有 Model(瘦的业务实体数据对象)、ModelManager(管理对象,数据层的访问也在其中实现)的两个对象,数据库也只是SQL Server,较为简单,但也不易扩展。

我的一点想法:

1)Enterprise Library 2.0 有些庞大和重量级,学习曲线太长,谨慎使用

2)Visual Studio 2005 中的数据集对象(DataSet)是个好东西,可以简化很多SQL语句的编写和参数的设定

3)Pet Shop 4.0 的总体架构还是不错的(Model <- ModelInfo -> IDAL <- SQLServerDAL),值得参考,但是在SQLServerDAL 和 OracleDAL 不用手动去编写代码,而是调用利用 DataSet 自动生成的代码来实现(SQLServer、Oracle、OLEDB或ODBC等),简单的业务对象管理动作应該是能直接利用DataSet提供的方法 直接实现,如果是复杂的数据层操作,可以自己编写代码来实现(如多个表之间的数据操作)

4)musicland 和 JGTM 2006 也提供了一种不错的实现方式,具体参考这篇Post

这样的话,开始提到的三个目的都能达到了。

.
应用/项目名称
UI层实现
Business Model & Logic Layer 实现
Data Access Layer 实现
Personal Web Site Starter Kit
在ASP.NET页面上直接利用 ObjectDataSource 来绑定 PhotoManager 中的方法来获取数据、更新数据
两个数据实体类(Album、Photo),一个管理类(PhotoManager)
自行解决数据库连接、使用 SqlCommand 来调用存储过程来完成

Club Web Site Starter Kit   
在ASP.NET页面上直接利用 SqlDataSource 来获取数据、更新数据
只有一些简单的 Helper/Utility类,业务逻辑大多在页面上实现
有一个DataSet,提取 Member表的数据,在自己的数据库中扩充了 SqlMembershipProvider的字段
Classifieds Site Starter Kit


在ASP.NET页面上,增/删/改主要是利用FormView调用BLL中的ModelDB来实现,数据列表主要利用ModelCache的List和ModelDB返回的ModelDataTable来绑定
1) BLL中实现了 ModelDB的类,调用DAL中的DataSet来进行数据更新,如果是查询数据(GetModelList),则得到 ModelDataComponent.ModelDataTable,这是数据集自动生成代码中的一个类

2) 在 App_Code 的Web目录中,主要实现了部分实体在 HTTP Context中的Cache功能,建立了 CachedModel(数据实体类)及其管理对象 ModelCache,后者主要是将BLL层的ModelDB的Retrive结果DataTable转成 List

全是ASP.NET 2.0 中的DataSet,实现了所有表数据的获取与更新,它是调用存储过程来实现的
Commerce Starter Kit



在ASP.NET页面上,有一些是直接调用 ModelManager对象来完成用户交互,有一些则是利用 ObjectDataSource 绑定 ModelManager 来达到同样功能对于某些操作,如果没有对应的 ModelManager 则直接使用 SqlDataSource

1) 在Objects目录下,定义了数据实体类,包含所有属性的Get/Set方法的定义,没有实例化方法,而是使用 void Load(IDataReader)来初始化,其中有一个对象(ShoppingCartItems),则继承至DataTable,利用 BuildDataTable()来进行初始化2) 利用数个 ModelProvider 将与数据库的主要交互功能封装起来,提供了实体层次的CRUD

3) 在 BLL 目录下,有数个 ModelManager,提供从业务层面对 Model 的操作,其中主要是调用 ModelProvider来完成具体的操作 在 ModelProvider项目中中,先定义ModelProvider抽象类,再由 SqlModelProvider 来继承,后者中利用 SqlHelper 来完成数据访问,主要是调用存储过程
全是ASP.NET 2.0 中的DataSet,实现了所有表数据的获取与更新,它是调用存储过程来实现的
Commerce Starter Kit

在ASP.NET页面上,有一些是直接调用 ModelManager对象来完成用户交互,有一些则是利用 ObjectDataSource 绑定 ModelManager 来达到同样功能对于某些操作,如果没有对应

1) 在Objects目录下,定义了数据实体类,包含所有属性的Get/Set方法的定义,没有实例化方法,而是使用 void Load(IDataReader)来初始化,其中有一个对象(ShoppingCartItems),则继承至DataTable,利用 BuildDataTable()来进行初始化
2) 利用数个 ModelProvider 将与数据库的主要交互功能封装起来,提供了实体层次的CRUD

3) 在 BLL 目录下,有数个 ModelManager,提供从业务层面对 Model 的操作,其中主要是调用 ModelProvider来完成具体的操作
在 ModelProvider项目中中,先定义ModelProvider抽象类,再由 SqlModelProvider 来继承,后者中利用 SqlHelper 来完成数据访问,主要是调用存储过程
Duwamish 7.1
(.NET 1.1)
调用BusinessFacade中的 OrderSystem 和 ProductSystem 中的方法完成用户交互,这主要是调用DAL层的相关对象来完成的
1) ModelData,继承自System.Data.DataSet,在构造函数里调用BuildDataTables()来初始化一个DataTable
2) 在用来存储Model数据
BusinessFacade和BusinessRule中,实现了与业务逻辑有关的内容,调用数据层的 Models 来完成数据访问
实现了数个 Models对象,提供了对于 ModelData的CRUD方法,它也是调用 SqlHelper 来完成与数据库的交互
Jobs Site Starter Kit   
利用 ObjectDataSource 绑定 Model 类,Command 主要是调用 Model 的 CRUD方法
在 Model 对象中定义了所有属性和CRUD方法,实现时调用了 DAL 的 DBAccess 对象,也使用了诸如 SqlParameter 等对象
只有一个类 DBAccess ,属于工具类,类似于 SqlHelper,它是利用 System.Data.SqlClient 来实现的,如果向其他数据库移植,代码量不大

大多数是调用 Model有直接调用 SqlDataProvider 来获取数据、更新
数据 在Dottext.Framework 的 Component 中定义了业务实体 Model 和 ModelCollection,在在Dottext.Framework定义了 Models 类,主要用提供 Model 的 CRUD 方法,其中的 R 返回 ModelCollection
Text 0.95
(.NET 1.1) 在Dottext.Framework 的 Data 中定义了 IDbProvider和 IDTOProvider 接口,然后提供了 DataDTOProvider 和 SqlDbProvider 的实现,其中调用了 SqlHelper 类
Community Server 2.1 SDK
(.NET 1.1 & 2.0)
直接调用 Models 的方法来获取数据、更新数据等
在 CommunityServerComponents 项目的 Components 中定义 Model 类,其中仅包含属性定义及构造 函数,另外定义了 Models 类,其中实现了 Model 的 CRUD 方法,它是调用 Provider 下的 CommonDataProvider 来完成数据访问的
在 CommunityServerComponents 项目的 Proivder 中,利用抽象CommonDataProvider 定义了所有 BLL & Model 层类需要的数据访问方法,然后在 SqlDataProvider 中项中使用 SqlDataProvider 继承此类,完成与 SQL Server 数据库的交互

在 ASP.NET 的页面上,大多是利用代码来调用 BLL 层的 Model 对象来获取数据、更新数据
Model 项目 中定义了所有的业务实体 ModelInfo
BLL 项目中定义业务实体 Model ,其中包含业务视角的 CRUD 方法,它们是调用 IDAL 中的 IModel 的 CRUD 方法来实现的 IDAL 项目中有多个接口定义 IModel,其中定义了需要实现的 Model 的 CRUD 方法

.Pet Shop 4.0
SqlServerDAL 和 OracleDAL 分别在两种数据库上实现了 IDAL
DALFactory 为工厂类,负责根据配置返回相应的 IDAL 的 IModel 实现类DBUtility 是 SQL Server 和 Oracle 数据库操作的工具类,主要是 SQLHelper 和 OracleHelper