Duwamish结构分析:
Duwamish 7.0 是一个典型的N层架构,其结构分为四个逻辑层:
***************************************************************************
***************************************************************************
Web 层 [表示层]
---目的:为客户端提供对应用程序的访问
---组成:由 ASP.NET Web 窗体和代码隐藏文件组成。Web 窗体只是用 HTML 提供用户操作,而代码隐藏文件实现各种控件的事件处理
---任务:只负责接受用户的输入并返回结果
book.aspx --图书的详细信息页
categories.aspx --图书分类显示页
default.aspx --首页,显示精选图书
errorpage.aspx --错误提示页
searchresults.aspx --搜索结果页,不支持分页
shoppingcart.aspx --购物车页,支持批量修改和更新
viewsource.aspx --源代码展示页
secure\account.aspx --新客户注册页及客户修改个人信息页
secure\checkout.aspx --确认购买页面,填写收货人的详细地址和联系方式,填入信用卡的信息,列出购买的清单及总的费用信息。
secure\order.aspx --显示用户的订单信息,以供用户打印该订单
secure\logon.aspx --用户登录页
用户控件统一放在modules文件夹下:
accountmodule.ascx 对应于account.aspx页面,新客户注册页及客户修改个人信息
bannermodule.ascx 每一页都包含有该用户控件,它定义的页面的头部信息,在页面中看到的头上的哪片黑色的区域就是它了,包含一个图片,三个按钮。
categoriesmodule.ascx 每一页都包含有该用户控件,它显示了书籍的分类信息。在页面的左边的”Browse Categories”文字开始到” Behind The Scenes”文字结束就是该控件的界面内容了
checkoutmodule.ascx 对应于checkout.aspx页,因为checkout.aspx页是一个按步骤操作的页(用panel控件控制),每走一页,checkoutmodule.ascx控件中的箭头就往前走或往后退一格。在父页面中通过控制checkoutmodule.ascx控件的Stage属性来控制
dailypickmodule.ascx 用于显示推荐的图书信息,在default.aspx页和categories.aspx页中用到
searchmodule.ascx 搜索功能控件,每页的搜索功能都由这个控件实现
viewsourcemodule.ascx 查看源码功能控件,每页的查看源功能都是由这个用户控件实现
***************************************************************************
***************************************************************************
Business/Facade 业务外观层 [中间层]
---目的:业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来
---组成:.cs代码。可以封装成类,直接调用
---任务:实现各种功能模块
类名称:CustomerSystem.cs
类功能:CustomerSystem类是客户系统的业务外观层,它为客户子系统提供了一个简单的接口,该类支持远程处理的应用程序中跨应用程序域边界访问。
类组成:CustomerSystem类只有三个方法,分别是:GetCustomerByEmail方法(从email和密码获得客户的信息),UpdateCustomer方法(更新客户的信息,接收一个CustomerData对象),CreateCustomer方法(用于创建一个新的客户了)
类名称:OrderSystem.cs
类功能:OrderSystem类用于处理订单的业务外观
类组成:它只有两个方法:GetOrderSummary方法(用于统计订单),AddOrder方法(用于新增一个订单)
类名称:ProductSystem.cs
类功能:ProductSystem类用于处理书的业务外观
类组成:GetCategories方法(通过分类的id获得类别自身的信息);GetCategoryItems方法(通过分类的id获得该类下的所有的书的信息);GetDailyPickItems方法(通过分类的id获得该类下的推荐书的信息);GetItemById方法(通过书的id获得有关书的信息);GetSearchItems方法(根据指定的检索字段条件以及书名的关键字查询书的信息)
###只有方法,没有属性### 是对web表示层中页面中操作的定义的方法,从而为web表示层提供了一个单一而简单的接口
***************************************************************************
***************************************************************************
Business/Rules 业务规则层 [中间层]
---目的:包含各种业务规则和逻辑的实现
---组成:.cs代码。可以封装成类,直接调用
---任务:实现验证任务,如客户帐户和书籍订单的验证
类名称:Customer.cs
类功能:验证客户信息
类组成:它有一个私有的常量REGEXP_ISVALIDEMAIL,用于验证客户的输入的email地址是否正确;insert方法用于验证和新建一条客户记录;update方法用于更新某个客户的信息;GetCustomerByEmail私有方法通过email验证是否已存在该客户的信息;Validate私有方法用于验证customer数据是否正确,它通过调用类内的IsValidEmail(验证email方法)和IsValidField(验证字段的内容是否超长字段规定的长度)来验证整个customer对象是否正确
类名称:Order.cs
类组成:私有的常量MINIMUM_SHIPPING_CHARGE,私有的常量STANDARD_ITEM_COUNT。CalculateTax方法用于计算税收。CalculateShipping用于计算购物的总价格。InsertOrder方法用于插入一个订单;IsValidField用于验证字段的正确性
***************************************************************************
***************************************************************************
DataAccess 数据访问层 [数据层]
---目的:为业务层(外观层、规则层)提供数据服务
---组成:.cs代码。可以封装成类,直接调用
---任务:实现数据库的操作
类名称:Books.cs
类组成:Books类有许多的方法,构造函数Books首先创建了一个SqlDataAdapter对象,然后指定了该对象的SqlConnection对象。Books类实现了Idisposable接口,实现的Dispose方法,用于销毁该对象。下面的各个方法都是根据不同的参数获得BookData,包括:GetBooksByCategorId(对应于同名的存储过程,通过类别id获得bookdata数据集对象),GetDailyPickBooksByCategoryId(对应于同名的存储过程,通过类别id获得推荐的bookdata数据集对象),GetBookById(通过书的id取得书的信息),GetBooksByAuthor(通过作者名获得书的信息,可能有N条记录),GetBooksByISBN(通过isbn获得书的信息),GetBooksBySubject,GetBooksByTitle,上述的方法其它都是通过FillBookData(通过传进行存储过程名作参数和参数值执行SqlDataAdapter对象的fill方法填充bookdata对象)方法执行对应的存储过程来获得BookData
类名称:Categories.cs
类组成:Categories类的方法比较少,除了构造函数和dispose方法外,就只有GetCategories方法(通过分类的id获得该类的父、本、子三级的分类对象)和FillCategoryData私有方法(为GetCategories方法从底层数据库中获取数据到CategoriesData)。
类名称:Customers.cs
类组成:Customers类除了构造函数和dispose方法外,有三个公开的方法,LoadCustomerByEmail方法(调用GetLoadCommand方法,获得sqlcommand对象后,执行GetCustomerByEmail存储过程,获得customerdata对象),UpdateCustomer方法(更新整个的customer对象,在UpdateCustomer存储过程中又调用了UpdateCustomerAddress存储过程来更新Addresses表。它有一个缺点就是每次更都会完全的更新两张表的所有的内容),InsertCustomer(与UpdateCustomer方法类似,它调用InsertCustomer和InsertAddress两个存储过程完成两个表的插入工作,唯一不同的插入操作是先插入主表,然后再插入从表。更新是先从表,后主表。),及三个私有的为前三个公开的方法服务的方法。GetLoadCommand方法(生成调用GetCustomerByEmail存储过程的sqlcommand命令返回),GetInsertCommand(生成调用InsertCustomer存储过程的sqlcommand命令返回,它用了sqlparameter对象的sourcecolumn属性映射对dataset的某个对象),GetUpdateCommand(它与GetInsertCommand方法类似)。
类名称:Orders.cs
类组成:Orders除了构造函数和dispose方法外,也只有一个公开的方法InsertOrderDetail方法(插入一个订单到数据库,详细的说明看源码注释)及一个私有方法GetInsertCommand(初始化DataAdapter对象的Insert命令参数集)
##数据访问层负责对业务层提供数据操作,也就是它负责和底层的数据库打交道 对数据库的所有操作均由存储过程完成,数据层只是在前台调用后台的存储过程##