.Net Pet Shop 4 初探之一:初识PetShop4

前言

早就听说.Net Pet Shop是学习ASP.net三层架构体系的最佳实例教材,近日学习中不断接触到三层架构的实例,对这一设计模式一直一知半解的我,决定彻底研究一下.Net Pet Shop.

关于.Net Pet Shop

凡是对于搞JAVA的朋友们,肯定都知道Java  Pet Shop的大名,想必朋友们也一定猜到了.Net Pet Shop和Java  Pet Shop的关系了.是的,它就是MS模仿参照Java  Pet Shop而搞出来的.Net版.Java平台和.Net平台的竞争从两都同时出现在这个世上的那一天起就一直不有停止过.可以说Java  Pet Shop代表的Jave平台的最先进开发思想,强大开发能力和灵活开发架构.而MS当然也不甘示弱,自然要在.Net平台上用.Net Pet Shop与Java一决高下,于是就有了集.Net先进思想和强大能力的实用多层架构于一身的.Net Pet Shop.这里且不说两个平台的优劣,因为这也不是一两句话能说得清楚的,关键是要学到例程中的开发思想并将它们应用于今后的项目实战.这才是我们学习研究.Net Pet Shop的最终目的.

clip_image001

目前,(2008年底).Net Pet Shop的最新版本是.Net Pet Shop 4,这是使用.net 2.0框架的网络实例.新的Petshop4实现了与Petshop 3相同甚至更多的特性,由于采用了Master Pages,Membership,以及Profile,SqlCacheDependency,但是代码量却减少了四分之一.同时,在事务,数据缓存,安全方面使用了.NET 2.0附带的特性,构建了一个灵活的最佳实践的应用程序.关于.Net Pet Shop 4 的详细介绍,朋友们可以从以下网址看到MS官方的说明:http://msdn.microsoft.com/zh-cn/library/aa479070.aspx

.Net Pet Shop 4的下载

http://download.microsoft.com/download/8/0/1/801ff297-aea6-46b9-8e11-810df5df1032/Microsoft%20.NET%20Pet%20Shop%204.0.msi

这是来自于MS官方的下载链接.文件是一个MSI的标准安装格式,大小只有2.3M.

我的安装环境

操作系统WINDOWS XP PRO SP3 CHS
浏览器IE6
.NET Framework.NET Framework 3.5
开发工具Visual Studio 2008
网络服务器IIS6
DBMSSQL Server 2005 Dev

.Net Pet Shop 4的安装

.Net Pet Shop 4是英文版的,其安装过程很简单,与一般的程序安装一样,一路"Next",直到出现"Installation Options"窗口时.默认选择的是只安装源代码,由于是首次安装,我选择了全部安装(包括源码与数据库).接着"Next"直到打开"DataBase Setup"窗口,选择使用数据库服务器的类型,服务器名以及登录验证模式,测试连接正常后继续.这样安装过程就完成了.

需要说明的是,在安装数据库的时候,我选择采用SQL Server认证模式,并输入正确的用户名和密码(用它登录SQL Server 2005 Management Studio 没有问题)时提示"验证无效",只好改用Windows验认模式了.

安装完成以后.安装程序会将源代码复制到你指定的目录下,并将用到的四个数据库自动附加到SQL Server中,由于.Net Pet Shop 4中采用的登录用户是mspetshop,所以,安装程序还会自动配置该用户,包括登录密码和映射的数据库对象等.

.Net Pet Shop 4数据库初步分析

.Net Pet Shop 4数据库共有4个,分别如下

1,MSPetShop4库,这是一个基本信息数据库,包括商品类别,商品详情,供应商信息等内容,其包含的表格信息如下表:

表名称功能描述包含内容
AspNet_SqlCacheTableForChangeNotification数据库缓存依赖信息表记录该库内各表之间的约束关系
Category商品目录表(大类)商品类别信息
Inventory商品数量信息表商品库存数量清单
Item商品详细信息表(具体商品)具体商品名称,价格,图片等信息
Product商品基本信息表(小类)商品的所属类别,名称及简单描述等信息
Supplier供应商信息表供应商基本信息数据

表间关系图:

image

2,MSPetShop4Orders库,这是一个订单管理数据库,包括订单基本信息及订单的详细项目信息等内容,其包含的表格信息如下表:

表名称功能描述包含内容
LineItem订单明细表每个订单所订的具体商品的数量和单价
Orders订单表所有订单的基本信息
OrderStatus订单状态表记录每个订单的当前状态及状态变更时间

表间关系图:

image

3,MSPetShop4Profile库,这是一个客户配置数据库,包括客户个人配置信息等内容,其包含的表格信息如下表:

表名称功能描述包含内容
Profiles客户个人配置信息表活动日期,更新日期等信息
Account客户账号信息表客户基本账户信息
Cart客户购物篮信息表客户选择的产品,数量等信息及购物篮类型

表间关系图:

image

4,MSPetShop4Services库,这是一个系统服务数据库,所有的表都是以"aspnet_"开头的,这些表是在ASP.Net 2.0中自动生成的,可以通过MemberShip等操作类直接读取数据库中的数据,其包含的表格信息如下表:

表名称功能描述包含内容
aspnet_Applications应用程序基本信息表程序名,程序描述等
aspnet_MembersShip用户信息表用户名,邮箱等用户用户基本信息
aspnet_Paths应用程序路径信息表应用程序路径信息
aspnet_PersonalizationPerUser用户个性化信息表所有用户的共同个性化信息
aspnet_Profile个性化配置内容表用户个性化配置的内容
aspnet_Roles角色表系统角色列表
aspnet_SchemaVersions版本信息表各部分的版本信息
aspnet_Users用户表系统用户列表
aspnet_UsersInRoles用户角色关系表用户与角色的关系
aspnet_WebEvent_Events事件日志表事件日志信息

表间关系图:

image

以上罗列了.Net Pet Shop 4 系统中的所以数据库和数据库中的表,并对各表的作用作了简单的说明,其实,对于数据库部分,还可以有很多更加深入的研究.比如:

  • 为什么不用1个数据库来存入所有的表?这样的做的好处是显而易见的:首先,4个数据库可以分布在不同的服务器上,可以达到负载平衡的目的;其次,当其中某数据库繁忙时,不至于影响到别的库为客户正常提供其它服务.提高了各功能之间的独立性.当然,MS可能还基于其它方面的考虑,朋友们可以就这一问题展开讨论.
  • 为什么不把MSPetShop4Services库中的aspnet_Users,aspnet_MembersShip,aspnet_Profile三个表合成一个?它们之间都是一对一的关系.我想:这可能是基于性能方面的考虑吧.
  • MSPetShop4Services库中的用户表和角色表之间本来是一种多对多的关系,即一个用户可以对应多种角色,一种角色也可是包含多个用户,为了表示这种多对多的关系,在数据库中通常是把它拆分成两个一对多的关系,生成一个关系表,即用户角色关系表.这种处理多对多关系的方法在数据库设计方面应用很常见.

Web.config文件加解密

Asp.net程序都有一个Web.config文件,它是应用程序的配置文件.细心的朋友可能早就发现,.Net Pet Shop 4 中的配置文件中的数据库连接字符串居然是一连串杂乱无章的字符,显然,它们已经被加密了.我们可以运行.Net Pet Shop 4 程序安装目录下的"DecryptWebConfig.bat"来对其进行解密,同样也可以运行旁边的"EncryptWebConfig.bat"来再次加密Web.config文件.

用记事本打开"DecryptWebConfig.bat"和"EncryptWebConfig.bat",,这是两个批处理文件,内容如下:

@echo off
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis.exe -pdf "connectionStrings" "E:/Lucker Develop Library(LDL)/Tech Tutorial/.NET Pet Shop 4.0/Web"
PAUSE

@echo off
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis.exe -pef "connectionStrings" "E:/Lucker Develop Library(LDL)/Tech Tutorial/.NET Pet Shop 4.0/Web"
PAUSE

原来,采用aspnet_regiis.exe -pdf 对文件的connectionStrings节进行了解密操作.用aspnet_regiis.exe -pef 对文件的connectionStrings节进行了加密操作.

项目内容概览

从整体可以看出,Pet Shop 4的项目体系已经很庞大,一共含有22个项目,如下:

image

查询网上相关文章,得到各项目的描述及功能分块列表(以字体着色区分)如下:

image

对于一名初学者来说,这么多的项目本身就是一种负担,但是,我们可以根据项目的命名来大致的区分出该项目的分层及功能,因为系统中项目的命名采用了形如"名称+层名"的形式,一般的:

项目名称后缀(层)说明内容
BLL业务逻辑层与具体业务相关的类
DAL数据访问层所有与数据库访问相关的操作
Factory工厂模式(暂时不很明白)
Strategy策略模式(暂时不很明白)
Web界面UI层所能界面与用户控件

再深入一步,网络上还可以找到以上项目相互之间的关系和调用图:

clip_image001[5]

一、Model主要功能: 1、 将每一个“业务实体”抽象成“(瘦数据)类”,可以很好地“划分”各个“对象”,操作更加清晰 2、 用于在应用程序各层之间传递数据,被用做传输数据的“容器” 3、 这就是所谓的“建模”过程! 4、 Model各个类(Model文件夹中的各个文件)划分或者说编制的原则,更趋向于模拟整个系统中的业务实体 二、实现细节: 1、 PetShop中Model的规划与数据库表的关系: (1) AccountInfo类——Account表 (2) AddressInfo类——无直接对应关系(对应Account表中一部分字段) (3) CartItemInfo类——无直接对应关系 (4) CreditCardInfo类——无直接对应关系 (5) ItemInfo类——Item表 (6) LineItemInfo类——无直接对应关系 (7) OrderInfo类——Orders表 (8) ProductInfo类——Product表 2、 为每一个Model中的类都标记了[Serializable],说明这些类可以被传行化,但是不能被继承! 3、 AccountInfo.cs文件:用户在网站注册的信息,及喜好选择情况 4、 使用构造函数可以初始化私有字段;使用属性可以读取私有字段(但使用属性不能设置私有字段的值) 5、 其中包含一个AddressInfo类的私有变量,和一个AddressInfo类的属性 6、 命名空间为PetShop.Model 7、 AddressInfo.cs文件:用户真实的个人姓名、住址和电话号码等信息 8、 与AccountInfo不同的是,AddressInfo类允许使用属性设置私有变量的值 9、 CartItemInfo.cs文件:描述购物车中每一种所选商品的信息的类 10、 该“类”对象的某些信息(如这里的Subtotal属性)可能并不是此类的“自然信息”,而需要经过简单计算而得到!这些简单但必要的信息也要在类的设计中体现出来! 11、 CreditCardInfo.cs文件:表示特定一张信用卡的信息 12、 ItemInfo.cs文件:一个Item指的是category"product"item,如猫"波斯猫"成年男波斯猫(或成年女波斯猫)。这个文件表示一个Item的所有信息 13、 productDesc字段的作用? 14、 LineItemInfo.cs文件:注意与CartItemInfo类的区别!LineItemInfo是用来描述用户最终确认的订单当中的某一种类的产品的信息的类 15、 同样包括了Subtotal属性 16、 OrderInfo.cs文件:用于显示用户某一个订单具体信息的类,在此一个订单当中,可能包括多个商品种类,即包括多个LineItemInfo对象(实际上在OrderInfo类中也确实存在LineItemInfo类型对象的一个数组!) 17、 ProductInfo.cs文件:包括一个特定Product的信息,如波斯猫 三、启发: 1、 来自Directory项目结束后的启发,以后做设计的时候,要将每个实体抽象为一个类,在整个系统中进行操作。 2、 在任意一个类当中,可能不只包括此实体类的自然信息,也可以包括一些对其他地方数据调用有用的属性信息,如根据数量和单价计算出来的总价属性,或者标志此实体的直属上级实体的属性 四、问题: 1、 忽然发现在MSDN上有文章,关于数据实体的:浏览 2、 抽象这些业务实体模型为瘦数据类的原则是什么?什么样的业务实体可以被抽象,或者说进行抽象后更有意义? 3、 ItemInfo类中,productDesc字段的作用? 一、IDAL主要功能: 1、 这完全是“工厂模式”的一部分实现而已 2、 这是一组接口类,其中包括了每个要公开的数据访问方法。为每个数据库产品单独编写的DAL(数据访问层)都要实现这组接口所定义的方法 3、 也就是规定了在DAL中编写的“对用户账号进行操作的类”所必须执行的方法! 4、 IDAL要达到的目的是:实现业务逻辑(BLL)与数据库访问(DAL)的完全分离!!! 5、 IDAL各个类(IDAL文件夹中的各个文件)划分或者说编制的原则,更趋向于“将对数据库的不同操作进行归类”,考虑的主要方面是数据库操作!!!例如,有对用户账号进行的一系列数据库操作,则将这一系列操作统一放置于IAccount接口(将来实现后的Account类)文件当中 二、实现细节: 1、 IAccount.cs文件:为针对不同数据库产品编写的“操作用户账号的类”所必须实现的一系列方法定义契约 2、 IInventory.cs文件:定义“操作库存量的类”所必须实现的一系列方法;或者说将操作库存量的一系列(所有)方法做一个汇总 3、 IItem.cs文件:定义“操作某一Item的类”所必须实现的一系列方法。(Item在Model中定义了,是指具体某一类别的Product,如男猫或女猫) 4、 对于其中的GetItemsByProduct()方法,返回的是一个ArrayList的接口类型(IList)的对象(见问题部分!) 5、 IOrder.cs文件:定义了一组DAL层中“操作用户订单的类”必须执行的方法。其中包括“添加一张新订单”的方法Insert()和根据一个已有的订单号取得此订单详细信息的方法GetOrder(),此方法返回的是一个OrderInfo对象。(Model中的OrderInfo类模型定义了用户的某一张Order中相关的信息,如发货地点,总价,信用卡号码等等) 6、 IProduct.cs文件:定义类一组在DAL层中编写的“对Product进行操作的类” 7、 IProfile.cs文件:定义一组在DAL层编写的“对用户Profile进行操作的类” 三、启发: 1、 这样就可以让在BLL层只针对IDAL层定义的接口进行编程(使用IDAL接口定义的这些方法)就可以了!!!无论在底层使用了什么厂家的数据库产品,有区别的只是针对此数据库产品编写的DAL层(相同的方法,如SignIn()方法,对于不同的数据库产品,可能有不同的实现方式!),而不会影响到上层的BLL层已经编写好的内容! 2、 从这里可以看到软件架构师和程序员工作上的区别!架构师要负责的是搭建系统的层次结构,定义接口;而程序员要负责的是针对接口的具体代码实现过程! 3、 这个IDAL接口的使用,主要是为了保证在底层数据库实现,甚至数据库产品发生变化的时候,不需要对上层BLL层的业务逻辑进行大量的修改!BLL层针对IDAL接口编程即可!!! 4、 IDAL文件夹中定义的所有的接口中的所有的方法,包括了整个程序要对数据库进行操作的所有方法 5、 由于PetShop只是一个演示程序,所以若对数据库操作的某一类别(如对Account进行操作)中定义的“操作类”不够用(如除了接口中定义的几个方法外还需要其他Account操作),还可以在接口中追加其他的方法,用以约束DAL层的实现类(如Account类)必须执行这些新增加的方法! 四、问题: 1、 定义这组接口后,如何保证为每个单独的数据库产品编写的DAL都执行这组接口所定义的方法?(答案:编写DAL的时候必须刻意保证,否则就失去了定义IDAL层分割BLL和DAL层的意义!!!) 2、 既然在实现GetItemsByProduct()方法的时候,也是要把返回的所有Item对象添加到一个ArrayList当中去,但为什么GetItemsByProduct()方法返回的不是一个ArrayList对象,而是一个IList接口的对象呢?仅仅是基类引用的方法吗?这里的基类引用有什么用呢?是否是由于为了不限制使用的数组形式?执行IList则可以使用ArrayList,也可以使用其他形式的数组??? 3、 IProduct.cs文件中为何要将查询条件参数定义为一个string类型的数组?
关键是系统架构和代码学习两方面,对初学和提高有很大帮助 petshop5.0比较大,代码已经解压出来 4.0和3.0没有解压出来,自行安装解压(需要SqlServer数据做连接或者在安装到数据库连接时直接拷贝出来) petshop5.0 基于.NET Framework 3.5 ------------ 使用LINQ to SQL改进数据访问层 PetShop.Model.DataContext.MSPetShop4DataContext 继承System.Data.Linq.DataContext PetShop.Model.ProductInfo与PetShop.Model.CategoryInfo实体类分别映射数据库PetShop.Model.ProductInfo其中的Category属性存在一对一的关系 PetShop.Model.CategoryInfo中的Products属性存在一对多的关系 使用WCF来提供RSS, web/FeedService.svc目录下 PetShop.SyndicationFeeds 并在UI层上做一些改进,如使用ASP.NET AJAX,ListView控件等。 在PetShop 5.0中引入了异步处理机制。 插入订单的策略可以分为同步和异步,两者的插入策略明显不同,但对于调用者而言,插入订单的接口是完全一样的,所以PetShop 5.0中设计了IBLLStrategy模块。 虽然在IBLLStrategy模块中,仅仅是简单的IOrderStategy,但同时也给出了一个范例和信息,那就是在业务逻辑的处理中,如果存在业务操作的多样化,或者是今后可能的变化,均应利用抽象的原理。或者使用接口,或者使用抽象类,从而脱离对具体业务的依赖。 不过在PetShop中,由于业务逻辑相对简单,这种思想体现得不够明显。 也正因为此,PetShop将核心的业务逻辑都放到了一个模块BLL中,并没有将具体的实现和抽象严格的按照模块分开。所以表示层和业务逻辑层之间的调用关系,其耦合度相对较高: PetShop4.0源代码 .NET Pet Shop4 应用程序的设计说明了构建企业 n 层 .NET 2.0 应用程序的最佳做法,这种应用程序可能需要支持各种数据库平台和部署方案。 .NET Pet Shop 4 项目的目标是: 工作效率:减少了 .NET Pet Shop 3 的代码数量 - 我们减少了近 25% 的代码。 利用 ASP.NET 2.0 的新功能 - 我们利用母版页、成员身份和配置文件,并设计出一个新的、吸引人的用户界面。 企业体系结构:构建一个灵活的最佳做法应用程序 - 我们实现了设计模式,以及表示层、业务层和数据层的分离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值