petshop概览和准备工作
前言
Microsoft公司为了配合推出.NET战略,不仅发布了一系列的开发工具和开发平台,同时还推出了.NET平台上的示范应用.其中的.Net Petshop就是极好的一例.这个电子商务的开发应用是为了应对J2EE平台而出炉的,在J2EE平台上Sun公司也有一个完整的实例----J2EE Petstore,它体现J2EE的BluePrint。二者解决的问题是一样的,功能也大同小异,界面也是如出一辙。自然是公说公有礼,婆说婆有礼了,我们姑且不管双方怎么声称自己的东西好,但是从中也能足见.NET和J2EE平台上的完美杰作是怎么样的一个实现。在这里,本人无意去争辩问题的胜负,也不打算去探讨J2EE是怎么样的解决方案和实现,只是作为纯粹的技术角度来管窥.NET平台上的.Net Petshop是如何一套的解决方案和实现的。我想,最好的学习,莫过于钻研这样的一套大的经典的系统,从设计的思想到最好的编码,毫无疑问对于我们将是大有裨益的。在这里,我将陆续的系列中逐步与大家一起探讨详解.Net Petshop的方方面面。希望大家多多指正!
.NET Pet Shop解决问题的描述
.NET Pet Shop是一个电子商务的实例,是在Microsoft的.NET平台上的一个具体实现。这个系统包含了B2C和B2B的实现。在这里我主要将的是B2C实现的部分,B2B在.NET Pet Shop里面不是重点要解决的问题。
.NET Pet Shop是一个在线的宠物购物系统,用户可以通过各种能够连接到internet的终端(包括移动终端)进行在线购物(具体界面见图一)。在这里,我将列出它将要实现的功能,也就是需求了:
(1) 用户帐号的管理功能:包括帐号创建,帐号登录,帐号维护;
(2) 产品浏览功能:类别浏览,具体产品浏览,详细信息,库存信息等等;
(3) 用户购物功能:添加购物,计算总价,下订单等等。
图一 .NET Pet Shop系统的登录主界面
.NET Pet Shop的逻辑结构
.NET Pet Shop按照三层的分层模型来部署整个系统。.NET Pet Shop分为数据展示层,中间层,数据层。这三层被清晰的分割为分布式应用的三个方面。其中数据展示层主要是完成界面和与最终用户交互的功能,在应用程序里面是一些aspx的页面和代码;中间层用于封装商业逻辑和规则,在应用程序里面被封装为.NET组件;数据访问通过中间层中的数据访问组件与SQL Server Provider交互,所有的数据获取依靠存储过程来进行,而不是通过SQL语句。图二是参考petshop的白皮书说明.NET Pet Shop的物理部署结构。
图二 .NET Pet Shop部署结构
.NET Pet Shop的开发环境支持
Microsoft的.NET战略是如此的宏大,同样的.NET Pet Shop需要的开发环境同样是很壮观的。以下是我调试.NET Pet Shop的环境,有些东西是可以替换的,有些不是必须的。大家可以根据自己的情况调整。
(1) 操作系统win2000 server,web服务器IIS5.0,数据库服务器SQL Server 2000;
(2) 开发工具Visual Studio.NET企业设计版。
在这里如果大家想很快的知道.NET Pet Shop 的UML模型,可以利用Visio来进行反向工程,就可以自动生成静态的类图(但是不可能生成用例图和序列图等等的)。同时Visio也可以对已经有的petshop数据库进行反向工程,生成数据库模型,从而对理解.NET Pet Shop大有帮助,也能够管窥一点微软的建模方法和设计过程。
.NET Pet Shop系统的安装
.NET Pet Shop的示例程序代码和白皮书可以在Microsoft的msdn网站上下载到,也可以到http://www.gotdotnet.com/compare去下载。
在petshop的文件夹下有database、petshopdoc和web以及webservice几个文件夹。Database是数据库的安装脚本,将你的数据库的sa密码设置为空即可直接运行这些脚本安装。Petshopdoc是英文的白皮书,后面的比较有参考价值了。Web是我们将要讨论的大部分程序代码。Webservice是用于发布的web服务。
petshop三层结构之DataTier |
交互的三层综述<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在前面的文章中,我们丛整个系统的角度了解了petshop的三层部署结构物理上的一个概貌,没有从应用程序的角度来说明是如何划分的,也不清楚数据展示层,中间层,数据层是如何交互的。为了更好的说明这个三层的结构以及每一层的具体细节问题,也让大家对整个应用有一个walkthrough,在这里我将说明从系统的角度来看(见参考图1),顾客在购物的过程中,系统的三层是如何的工作以及如何的交互。这个东西有点象UML里面的实例情景故事,对需求和分析的进一步是大有帮助的。
图1 .NET Petshop 架构
从这个情景中,我们可以很清晰的了解到Internet Customer在购物时系统的运作情形。首先通过数据展示层的用户交互界面Cart.aspx页面输入顾客购买的商品以及数量,然后这些购物清单由后台的应用程序(cart.aspx.cs)做相应的预处理(如安全验证,校验,数据的格式化等等),接着调用中间件(在程序结构里面就是一些.NET Assembly,封装了购物的商业逻辑),最后通过数据访问接口来更新数据库里面的数据(数据层)。
数据层(Database)
.NET Petshop的数据库并不是十分的庞大,总共有12个用户表和23个存储过程。Petshop数据库里面存储的是用户数据,帐号数据,产品数据,用户配置数据,订单数据,库存数据以及供应商的数据。应用程序访问数据库的数据并不是直接的与数据库表打交道,而是通过存储过程的运行来获取所需要的数据。这样的设计有一个好处就是,避免了频繁的表操作,而通过运行在服务器端的存储过程可以极大的提高运作效率和提升访问数据的速度,同时也很好的屏蔽了数据库表的逻辑,使得数据库访问变成了数据库提供的服务访问。当然,也有人指责说这些存储过程迁移性是值得怀疑的。
下面我将通过表格把这些数据库的基本表列出来(见表1),并一一做说明,希望对大家深入的理解有帮助。
表名称 |
备注信息 |
Account |
基本用户信息。 |
BannerData |
存储的是系统界面的banner图片的设置信息。 |
Category |
宠物的类别目录表(比如鱼类,狗类等等)。 |
Inventory |
宠物产品的存货信息。 |
Item |
单个产品的详细信息。 |
LineItem |
订单的每一项的详细信息,包括产品名称和数量,价格等。 |
Orders |
用户购物的订单,一个订单可以包括多项LineItem |
OrderStatus |
订单的状态 |
Product |
宠物的产品列表,一条Product可能包括多个Item |
Profile |
用户配置表,用于记录他们的favorites。 |
Signon |
用户帐号登陆表,因为常用,故从Account独立出来。 |
Supplier |
供应商信息。 |
通过上表我们知道了petshop数据库的数据库表的一些信息,但是这些表之间到底是一种什么样的关系呢?关心数据库建模和设计的人可能对这个问题比较感兴趣。在这里,我将给出图表(图2)说明这些数据库表之间的关系。图2中列出了这些表之间的关系和主键信息。
图2:petshop数据库物理设计模式
技巧:其实对于从事过数据库建模和设计的人都知道,得到上面的数据库模型图形并不是一件很困难的事情。正如我们前面提到的一样,我们可以用Visio做工程反转就可以得到上面这么美观的设计模型图了。同时,我们也可以在模型图中做修改设计,可以马上应用到你的物理数据库,使其保持同步。
说完了基本的数据库表,接下来我们看看存储过程。用微软的话说,只有设计称存储过程,才算是”cleaner separation of code from the middle-tier”,我个人觉得这样做是很好的。同样的,我把它列在一个表格里(表2)。
存储过程名称 |
备注信息 |
upAccountAdd |
增加一个帐号。 |
upAccountGetAddress |
获取用户的地址,主要用于下订单时注册地址与送货地址不一。 |
upAccountGetDetails |
获取帐号的详细信息。 |
upAccountLogin |
用户登陆验证。 |
upAccountUpdate |
更新用户帐号。 |
upCategoryGetList |
获取某个类别的产品列表。 |
upInventoryAdd |
增加指定的项到存活信息。 |
upInventoryGetList | | |