首页  :: 订阅 订阅  :: 管理

Duwamish Learning

Posted on 2005-04-21 13:44  GaoJie[高杰]  阅读(343)  评论(0)    收藏  举报

Microsoft Duwamish7.0

 

 

Index and Contents

 

 


 

1. Install

 

 

D:\Program Files\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\duwamish.msi

 

 

2. Browser

 

http://localhost/duwamish7

 

3. Architecture

  Duwamish 7.0 结构分为四个逻辑层:

·                 Web

Web 层为客户端提供对应用程序的访问。这一层是作为 Duwamish.sln 解决方案文件中的 Web 项目实现的。Web 层由 ASP.NET Web 窗体和代码隐藏文件组成。Web 窗体只是用 HTML 提供用户操作,而代码隐藏文件实现各种控件的事件处理。

·                 业务外观层

业务外观层为 Web 层提供处理帐户、类别浏览和购书的界面。这一层是作为 Duwamish.sln 解决方案文件中的 BusinessFacade 项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。

·                 业务规则层

业务规则层是作为 Duwamish.sln 解决方案文件中的 BusinessRules 项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。

·                 数据访问层

数据访问层为业务规则层提供数据服务。这一层是作为 Duwamish.sln 解决方案文件中的 DataAccess 项目实现的。

注意   有关更多信息,请参见解决方案文件和环境设置

除了上述四个逻辑层外,Duwamish 7.0 还包含封装在 Duwamish.sln 解决方案文件中的 Common 项目内的共享函数。通用”(Common) 层包含用于在各层间传递信息的数据集。Common 项目还包含 Duwamish.sln 解决方案文件中的 SystemFramework 项目内的应用程序配置和跟踪类。

结构关系图

层间交互

Duwamish 7.0 结构允许分布式或非分布式部署方案。有关部署选项的详细信息,请参见 Duwamish 7.0 的安装和部署方案。这两种部署方案都有可能,因为 .NET 程序集和 Web 层是独立的可部署单元。尽管可将这些程序集物理部署为任意配置,但由于性能原因,在选择部署方案之前,应考虑层间交互的问题。例如,业务外观层、业务规则层和数据访问层之间的紧密交互要求将这些单元放在一起。为了阐明此紧密交互,请参见结帐中的序列关系图。

顶级活动关系图

下列高级统一建模语言 (UML) 活动关系图描述进入 Duwamish 7.0 Web 站点的用户可以使用的活动和选项。

注意   此关系图是一个标准的 UML 活动关系图。有关更多信息,请参见统一建模语言 (UML)

Duwamish 顶级活动关系图

 

1.      Used Technology

Duwamish 7.0 在其结构中使用了多种关键技术。以下是这些技术的列表:

·                 Windows 2000 Server Windows XP Server

·                 ASP.NET

·                 Web 窗体

·                 Web 服务

·                 服务器控件

·                 C#

·                 Visual Basic .NET

·                 Internet 信息服务

·                 ADO.NET

·                 企业级模板

·                 .NET 远程处理

·                 SQL Server 2000

 

4. Detail Design

4.1 帐户管理

“Account Details”(帐户明细)页显示用户的帐户信息,还允许用户修改帐户信息。但是,在可以修改信息前,用户必须首先通过登录过程登录和创建帐户。任何已经创建帐户的用户都可以返回到“Logon”(登录)页,键入凭据,然后前进到“Account Details”页修改帐户信息。有关登录过程的更多信息,请参见登录

实现

“Account Details”(帐户明细)页使用下面的 ASP.NET 文件和 C# Visual Basic .NET 代码隐藏文件:

Account.aspx

Account.aspx.cs

Account.aspx.vb

注意   有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序

创建新帐户的序列关系图

过程概述

Web 层启动帐户管理过程。当加载页时,通过 Web 层的 Duwamish7.Web.Account.SubmitButton_Click 方法和 Duwamish7.Web.AccountModule.ProcessChanges 方法更新用户的帐户信息。然后,Web 方法调用业务外观的 Duwamish7.BusinessFacade.CustomerSystem.UpdateCustomer 方法,该方法创建密码的经过 salt 和散列运算的新表示形式,然后使用业务规则层的 Duwamish7.BusinessRules.Customer.Update 方法。下一步,调用数据访问层的 Duwamish7.DataAccess.Customers.UpdateCustomer 方法,而此方法又调用数据库层中的 UpdateCustomer 存储过程。

如果用户创建新帐户,则 Web 层的 Duwamish7.Web.Secure.Logon.SubmitButton_Click 方法向 Duwamish 7.0 应用程序的数据库提供用户帐户信息。Duwamish7.Web.Secure.Logon.SubmitButton_Click 方法调用 Duwamish7.Web.AccountModule.ProcessChanges 方法,而后者调用业务外观层的 Duwamish7.BusinessFacade.CustomerSystem.CreateCustomer 方法。Duwamish7.BusinessFacade.CustomerSystem.CreateCustomer 方法为用户创建密码的经过 salt 和散列运算的表示形式,然后调用业务规则层的 Duwamish7.BusinessRules.Customer.Insert 方法。如果新用户尝试使用数据库内已有的电子邮件地址,则应用程序通知用户电子邮件地址已在使用中。用户必须提交数据库内尚没有的另一个电子邮件地址。假定用户提交唯一的电子邮件地址,Duwamish7.BusinessRules.Customer.Insert 方法调用数据访问层的 Duwamish7.DataAccess.Customers.InsertCustomer 方法。然后 Duwamish7.DataAccess.Customers.InsertCustomer 方法调用数据库层的 InsertCustomer 存储过程,后者在数据库内创建新的客户帐户。

 

Duwamish7.Web.Account.SubmitButton_Click 方法:

[C#]

/// <summary>

///     Validates then saves off the customer account information.

///     <param name="sender">The source of the event.</param>

///     <param name="e">An EventArgs that contains the event data.</param>

/// </summary>

public void SubmitButton_Click(Object sender, EventArgs e)

{

    //

    // Process the changes to the form

    //

    ModuleAccount.ProcessChanges();

}

 

Duwamish7.Web.AccountModule.ProcessChanges 方法:

[C#]

/// <summary>

///     Validates then saves off the customer account information.

///     <remarks>If this is a new customer, then create the item, or edit for an existing customer.</remarks>

///     <remarks>This is called from the page where this user control exists.</remarks>

///     <retvalue>Returns true on success, false otherwise.</retvalue>

/// </summary>

public bool ProcessChanges()

{

    //

    // Update the Database

    //

    if ( SaveCustomer() )

    {

        EditLabel.Visible = false;

        CreateLabel.Visible = false;

        UpdatedLabel.Visible = true;

       

        return true;

    }

    else

    {

        //

        // Show any errors

        //

        DisplayErrors();

       

        UpdatedLabel.Visible = false;

        

        return false;

    }

}

 

 

4.2 类别浏览

 

实现

类别浏览功能使用下面的 ASP.NET 文件和 C# Visual Basic .NET 代码隐藏文件:

Categories.aspx

Categories.aspx.cs

Categories.aspx.vb

注意   有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序

过程概述

用户选择了某个类别(如历史)后,URL 的参数将类别 ID 传递到“Categories”(类别)页的 Page_Load 函数。然后 Page_Load 函数为所选类别中的图书调用业务外观层的 Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法。下一步,Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法调用数据访问层的 Duwamish7.DataAccess.Books.GetBooksByCategoryId 方法,后者接着调用 GetBooksByCategoryID 存储过程 (SPROC),以显示与所选类别相关联的项列表。另外,Page_Load 函数使用 DailyPickModule 用户控件显示请求类别的关联的图书。若要检索每日精选,可使用业务外观层的 Duwamish7.BusinessFacade.ProductSystem.GetDailyPickItems 方法调用数据访问层的 Duwamish7.DataAccess.Books.GetDailyPickBooksByCategoryId 方法和 GetDailyPickBooksByCategoryId SPROC。然后 ASP.NET DataBind() 方法将 ASP.NET 页与请求类别的图书和每日精选绑定在一起。

 

4.3 结帐

 

用户登录后,“Checkout”(结帐)ASP.NET 页上的功能使用户能够完成购物过程并结束交易。

实现

“Checkout”(结帐)页使用下面的 ASP.NET 文件和 C# Visual Basic .NET 代码隐藏文件:

Checkout.aspx

Checkout.aspx.cs

Checkout.aspx.vb

注意   有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序

序列关系图

过程概述

用户从 ASP.NET 页顶部选择购物车选项或者在图书选区选择了“Add To Cart”(添加到购物车)按钮后,应用程序显示“shopping cart”(购物车)页。有关更多信息,请参见购物车。若要继续运行到结帐,用户须单击“Proceed to Checkout”(前进到结帐)链接。关联的 Forms 身份验证或者调用要登录的用户,或者向已登录的用户显示结帐过程的步骤。有关更多信息,请参见登录。当用户登录时,用户的帐户信息(地址等)保持在会话状态中。所有的结帐步骤都是同一 ASP.NET 页的一部分。下面的 Web 控制面板指导每个用户完成结帐步骤:

Duwamish7.Web.Checkout.ShippingPanel

加载此页时,ASP.NET Page_Load 方法用包含在会话状态(在登录过程中获得)中和通过 Cart Helper 类访问的值填充“Shipping”(发货)Web 控制面板。

Duwamish7.Web.Checkout.PaymentPanel

“Payment Details”(付款详细信息)Web 控制面板要求用户提供详细的信用卡信息。然后通过 ShoppingCart.SetPayment 方法将付费信息复制到 Cart Helper 类。

Duwamish7.Web.Checkout.SummaryPanel

结帐过程的最后一步是确认订单。当用户单击“Confirm”(确认)按钮时,Web 层的 Duwamish7.Web.Checkout.NextImageButton 方法调用 Cart Helper 类的 Duwamish7.Web.Cart.AddOrder 方法。下一步,Duwamish7.Web.Cart.AddOrder 方法调用业务外观层的 Duwamish7.BusinessFacade.OrderSystem.AddOrder 方法。接着,Duwamish7.BusinessFacade.OrderSystem.AddOrder 方法调用业务规则层的 Duwamish7.BusinessRules.Order.InsertOrder 方法。下一步,它调用数据访问层的 Duwamish7.DataAccess.Orders.InsertOrderDetail 方法。Duwamish7.DataAccess.Orders.InsertOrderDetail 方法调用 InsertSale 存储过程 (SPROC),而后者将交易保存到数据库。

安全说明   Duwamish 7.0 示例应用程序在 SQL 数据库内以明文形式存储信用卡号码。虽然这些号码受 SQL Server 安全性保护,但在实际应用程序中,可以采取其他安全措施,先将这些号码加密,然后再将其保存在数据库中。您的最终决定将取决于您应用程序的信用卡处理系统的实现方式。有关加密的更多信息,请参见 System.Security.Cryptography Namespace

有关 ASP.NET 面板的更多信息,请参见 Panel

结构决策

Cart 类收集 Web 层上的订单所需要的信息,然后通过业务外观层提交完成的订单。这维护了无状态的业务外观层以提高可伸缩性。另一种方法是将购物车保持到 SQL。这样可避免在会话超时时丢失购物车的可能性,并且允许用户以后重新连接自己的购物车。

要点

插入订单是调用业务规则的少数几个地方之一。

若要查找适用于本主题中特定层的源代码,请单击相应的链接:

业务外观源 | 业务规则源代码 | 数据访问源代码 | SPROC

 

 

4.4 登陆

用户在管理帐户或进行购买前,他或她必须使用熟悉的登录过程登录到 Duwamish 7.0“Logon”(登录)页使用 ASP.NET 基于窗体的身份验证来验证用户是否提供了唯一的电子邮件别名和密码。尚未建立帐户的用户可以通过单击“New Customer”(新建客户)按钮创建一个帐户。有关创建新帐户的详细信息,请参见帐户管理

实现

“Logon”(登录)页使用下面的 ASP.NET 文件和 C# Visual Basic .NET 代码隐藏文件:

·                 Logon.aspx

·                 Logon.aspx.cs

·                 Logon.aspx.vb

注意   有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序

过程概述

Web 层中启动登录过程。用户输入电子邮件地址和密码(凭据),然后单击“Logon”(登录)按钮,这将调用 Duwamish7.Web.Logon.LogonButton_Click 方法。下一步,Duwamish7.Web.Logon.LogonButton_Click 方法创建密码的散列表示形式,并将凭据传递给业务外观层的 Duwamish7.BusinessFacade.CustomerSystem.GetCustomerByEmail 方法。接着 Duwamish7.DataAccess.Customers.LoadCustomerByEmail 方法调用数据访问层,后者又调用 GetCustomerByEmail 存储过程 (SPROC)。然后通过 ComparePasswords 方法,相对于从数据库中检索的经过 salt 和散列运算的密码来验证散列密码。如果凭据有效,则客户帐户信息成功地存储到 Cart 对象,并且 ASP.NET Forms 身份验证通过 pageBase ShoppingCart.Customer() 属性验证凭据。如果凭据无效,则 MismatchLabel 设置为可见,它在 ASP.NET 页上显示下面的内容:“Invalid email address or password- please try again”(电子邮件地址或密码无效,请再试一次)。

注意   有关对密码进行 salt 和散列运算的进一步信息,请参见密码凭据保护

若要查找适用于本主题中特定层的源代码,请单击相应的链接:

业务外观源代码 | 数据访问源代码 | SPROC

 

4.5 购物车

购物车显示用户已经选择购买的图书。它还提供选项修改每本选中的图书的数量。

实现

“Shopping Cart”(购物车)页使用下面的 ASP.NET 文件和 C# Visual Basic .NET 代码隐藏文件:

·                 ShoppingCart.aspx

·                 ShoppingCart.aspx.cs

·                 ShoppingCart.aspx.vb

注意   有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 用程序

过程概述

用户从 ASP.NET 页顶部选择购物车选项或者在图书选区选择“Add To Cart”(添加到购物车)按钮后,应用程序显示“Shopping Cart”(购物车)页。若要继续运行到结帐,用户须单击“Proceed to Checkout”(前进到结帐)链接。有关更多信息,请参见结帐。在购物车中,用户可以修改每本选中图书的数量。当用户单击“Update”(更新)按钮时,Duwamish7.Web.ShoppingCart.UpdateButton_Click 方法调用 Duwamish7.Web.Cart.UpdateItems 方法更改数量。(每项所允许的最大数量为 50。)当用户输入的数量为零时,Duwamish7.Web.Cart.UpdateItems 方法还处理图书的删除操作。

结构决策

Web 层没有处理购物车管理的调用,因此可伸缩性和性能都得到了提高。这种方法的不利因素是如果会话状态超时,购物车可能丢失。另一种方法是退出购物车返回 SQL。有关 Duwamish 7.0 中的会话状态的进一步信息,请参见用户服务

 

 

4.6 搜索

 

“Search”(搜索)用户控件由 SearchModule 实现,它位于大多数 ASP.NET 页的左上角,并且使用下拉式列表框和相关联的文本框,使用户能够找到图书。下拉式列表中的选项是:

·                 Title(标题)

·                 ISBN

·                 Author(作者)

·                 Subject(主题)

实现

SearchModule 用户控件使用下面的 ASP.NET 文件和 C# Visual Basic .NET 代码隐藏文件:

·                 SearchModule.ascx

·                 SearchModule.ascx.cs

·                 SearchModule.ascx.vb

注意   有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序

过程概述

用户从下拉式列表中选择搜索类型,如按“Author”(作者)。然后用户在文本框内输入想要的文本并单击“Go”(执行)按钮。“Go”按钮调用 Web 层的 Duwamish7.Web.SearchModule.SearchButton_Click 方法,该方法重定向到 ASP.NET“Search Results”(搜索结果)页,并将在下拉式列表和文本框中输入的搜索参数添加到 URL。下一步,Duwamish7.Web.SearchResults Page_Load 方法使用 URL 提供的搜索参数调用业务外观层的 Duwamish7.BusinessFacade.ProductSystem.GetSearchItems 方法。随后,Duwamish7.BusinessFacade.ProductSystem.GetSearchItems 方法调用相应的数据访问层的方法:

·                 Duwamish7.DataAccess.Books.GetBooksByTitle 方法

调用 GetBooksByTitle 存储过程 (SPROC)

·                 Duwamish7.DataAccess.Books.GetBooksByISBN 方法

调用 GetBooksByISBN 存储过程 (SPROC)

·                 Duwamish7.DataAccess.Books.GetBooksByAuthor 方法

调用 GetBooksByAuthor 存储过程 (SPROC)

·                 Duwamish7.DataAccess.Books.GetBooksBySubject 方法

调用 GetBooksBySubject 存储过程 (SPROC)

结构决策

作为用户控件实现搜索的决策最大化重用。因此,所有需要搜索功能的页都可以只是包括 SearchModule 用户控件。

若要查找适用于本主题中特定层的源代码,请单击相应的链接:

业务外观源代码 | 数据访问源代码 | SPROC