Duwamish7分析——类别浏览

由 CategoriesModule 实现的“Browse Categories”(浏览类别)用户控件位于大多数 ASP.NET 页的左边,它使用户能够按类别查找书籍。类别包括:
Anthropology(人类学)
Art(艺术)
Biography(传记)
Business(商业)
Computers(计算机)
Cookbooks(烹饪)
Essays(散文)
Fiction(小说)
History(历史)
Literature Critiques(文学评论)
Mythology(神话)
Philosophy(哲学)
Poetry & Plays(诗歌和戏剧)
Psychology(心理学)
Reference(参考)
Science(科学)
Sports(体育)
Travel(旅行)
DailyPickModule 用户控件创建一个与每个 ASP.NET 页顶部的每个类别(历史等)关联的“Pick Of The Day”(每日精选)。
实现
类别浏览功能使用下面的 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 页与请求类别的图书和每日精选绑定在一起。
结构决策
Duwamish 7.0 对“每日精选”使用一个用户控件。该用户控件在“Default”(默认)和“Categories”(类别)页上重新使用。
若要查找适用于本主题中特定层的源代码,请单击相应的链接:
业务外观源代码 | 数据访问源代码 | SPROC
Web 源代码
Web 源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Web/Categories.aspx.cs 文件。
注意   如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Page_Load:
[C#]
/// <summary>
///     Populate the page with the category information then mark
///     the page as cached.
///     <remarks>Called whenever the page is loaded.</remarks>
///     <param name="sender">The source of the event.</param>
///     <param name="e">An EventArgs that contains the event data.</param>
/// </summary>
protected void Page_Load(Object sender, EventArgs e)
{
    int categoryID = -1;    // Default value
    if (!IsPostBack)
    {
...
        //
        // Read the books in the category
        //
        BookData itemSet = productSystem.GetCategoryItems(categoryID);
        //
        // Save the view for data binding
        //
        itemView = itemSet.Tables[BookData.BOOKS_TABLE].DefaultView;
        //
        // Set the DailyPick category
        //
        ModuleDailyPick.CategoryID = categoryID;
...
        //       
        // Remind the page that it needs bind its controls to the data.
        //
        DataBind();
    }       
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Sub Categories_Load:
'   Populate the page with the category information then mark
'     the page as cached.
'----------------------------------------------------------------
Private Sub Categories_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim categoryID As Integer  = -1      ' Default Value
    If Not Me.IsPostback Then
...
        '
        ' Read the books in the category
        '
        Dim itemSet As BookData
        itemSet = productSystem.GetCategoryItems(categoryID)
        '
        ' Save the view for data binding
        '
        itemView = itemSet.Tables(BookData.BOOKS_TABLE).DefaultView
        '
        ' Set the DailyPick category
        '
        ModuleDailyPick.CategoryID = categoryID
...
        '       
        ' Remind the page that it needs bind its controls to the data.
        '
        DataBind()
    End If
End Sub
业务外观源代码
Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法和 Duwamish7.BusinessFacade.ProductSystem.GetDailyPickItems 方法源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Business/Facade/ProductSystem.cs 文件。
注意   如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法:
[C#]
/// <summary>
///     Retrieves a BookData dataset containing all the items in the specified category.
///     <param name="categoryId">The category id for item retrieval.</param>
///     <retvalue>A BookData dataset containing all the items in the specified category.</retvalue>
///     <exception> class='System.ApplicationException'>
///         The categoryId is invalid.
///     </exception>
/// </summary>
public BookData GetCategoryItems(int categoryId)
{
    //
    // Check preconditions
    //
    ApplicationAssert.CheckCondition(categoryId >= 0,"Invalid Category Id",ApplicationAssert.LineNumber);
    //
    // Retrieve the data
    //
    using (Books bookDataAccess = new Books())
    {
        return bookDataAccess.GetBooksByCategoryId(categoryId);
    }
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetCategoryItems
'   Retrieves a dataset containing all the items in the specified
'     category.
' Returns:
'   A dataset containing all the items in the specified
'     category.
' Parameters:
'   [in]  categoryId: The category id for item retrieval
'----------------------------------------------------------------
Public Function GetCategoryItems(ByVal categoryId As Integer) As BookData
    '
    ' Check preconditions
    '
    ApplicationAssert.CheckCondition(categoryId >= 0,"Invalid Category Id",ApplicationAssert.LineNumber)
    '
    ' Retrieve the data
    '
    With New Books
        GetCategoryItems = .GetBooksByCategoryId(categoryId)
    End With
End Function
Duwamish7.BusinessFacade.ProductSystem.GetDailyPickItems 方法:
[C#]
// <summary>
///     Retrieves a BookData dataset containing all the DailyPick items in the  specified category.
///     <param name="categoryId">The category id for DailyPick item retrieval.</param>
///     <retvalue>A BookData dataset containing all the DailyPick items in the specified category.</retvalue>
///     <exception> class='System.ApplicationException'>
///         The categoryId is invalid.
///     </exception>
/// </summary>
public BookData GetDailyPickItems(int categoryId)
{
    //
    // Check preconditions
    //
    ApplicationAssert.CheckCondition(categoryId > 0,"Invalid Category Id",ApplicationAssert.LineNumber);
    //
    // Retrieve the data
    //
    using (Books bookDataAccess = new Books())
    {
        return bookDataAccess.GetDailyPickBooksByCategoryId(categoryId);
    }
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetDailyPickItems
'   Retrieves a dataset containing all the DailyPick items in the
'     specified category.
' Returns:
'   A dataset containing all the DailyPick items in the specified
'     category.
' Parameters:
'   [in]  categoryId: The category id for DailyPick item retrieval
'----------------------------------------------------------------
Public Function GetDailyPickItems(ByVal categoryId As Integer) As BookData
    '
    ' Check preconditions
    '
    ApplicationAssert.CheckCondition(categoryId > 0,"Invalid Category Id",ApplicationAssert.LineNumber)
    '
    ' Retrieve the data
    '
    With New Books
        GetDailyPickItems = .GetDailyPickBooksByCategoryId(categoryId)
    End With
End Function
数据访问源代码
Duwamish7.DataAccess.Books.GetBooksByCategoryId 方法和 Duwamish7.DataAccess.Books.GetDailyPickBooksByCategoryId 方法源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/DataAccess/Books.cs 文件。
注意   如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Duwamish7.DataAccess.Books.GetBooksByCategoryId 方法:
[C#]
/// <summary>
///     Retrieves all books for a specified category.
///     <param name="categoryId">Id of category to search for.</param>
///     <retvalue>BookData, a dataset containing detailed book information.</retvalue>
/// </summary>
public BookData GetBooksByCategoryId(int categoryId)
{
    return FillBookData("GetBooksByCategoryId", "@CategoryId", categoryId.ToString());
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetBooksByCategoryId:
'   Retrieves all books for a specified category.
' Returns:
'   BookData, a dataset containing detailed book information.
' Parameters:
'   [in]  categoryId: Id of category to search for.
'----------------------------------------------------------------
Public Function GetBooksByCategoryId(ByVal categoryId As Integer) As BookData
    GetBooksByCategoryId = FillBookData("GetBooksByCategoryId", "@CategoryId", CStr(categoryId))
End Function
Duwamish7.DataAccess.Books.GetDailyPickBooksByCategoryId 方法:
[C#]
/// <summary>
///     Retrieves DailyPick books for a specified category.
///     <param name="categoryId">Id of category to search for.</param>
///     <retvalue>BookData, a dataset containing detailed DailyPick book </retvalue>
/// </summary>
public BookData GetDailyPickBooksByCategoryId(int categoryId)
{
    return FillBookData("GetDailyPickBooksByCategoryId", "@CategoryId", categoryId.ToString());
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetDailyPickBooksByCategoryId:
'   Retrieves DailyPick books for a specified category.
' Returns:
'   BookData, a dataset containing detailed DailyPick book
'     information.
' Parameters:
'   [in]  categoryId: Id of category to search for.
'----------------------------------------------------------------
Public Function GetDailyPickBooksByCategoryId(ByVal categoryId As Integer) As BookData
    GetDailyPickBooksByCategoryId = FillBookData("GetDailyPickBooksByCategoryId",  "@CategoryId", CStr(categoryId))
End Function
创建和填充 BookData 数据集的 Helper 函数:
[C#]
//----------------------------------------------------------------
// Function FillBookData:
//   Helper function to create and populate a BookData dataset
// Returns:
//   BookData, a dataset containing detailed book information.
// Parameters:
//   [in]  commandText: sql stored procedure to run.
//   [in]  paramName: sql paramater name.
//   [in]  paramValue: sql paramater.
//----------------------------------------------------------------
private BookData FillBookData(String commandText, String paramName, String paramValue)
{
    if (dsCommand == null )
    {
        throw new System.ObjectDisposedException( GetType().FullName );
    }           
    BookData   data    = new BookData();
    SqlCommand command = dsCommand.SelectCommand;

    command.CommandText = commandText;
    command.CommandType = CommandType.StoredProcedure; // use stored proc for perf
    SqlParameter param = new SqlParameter(paramName, SqlDbType.NVarChar, 255);
    param.Value = paramValue;
    command.Parameters.Add(param);           

    dsCommand.Fill(data);
    return data;
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function FillBookData:
'   Helper function to create and populate a BookData dataset
' Returns:
'   BookData, a dataset containing detailed book information.
' Parameters:       
'   [in]  cmdText: sql stored procedure to run.
'   [in]  paramName: sql paramater name.
'   [in]  paramValue: sql paramater.
'----------------------------------------------------------------
Private Function FillBookData(ByVal cmdText As String, ByVal paramName As String, ByVal paramValue As String) As BookData
    Dim data As BookData
    data = New BookData

    With dsCommand
        Try   
            With .SelectCommand
                .CommandType = CommandType.StoredProcedure  ' use stored proc for perf
                .CommandText = cmdText
                Dim param As SqlParameter = new SqlParameter(paramName, SqlDbType.NVarChar, 255)
                param.Value = paramValue
                .Parameters.Add(param)
            End With
            .Fill(data)
        Finally
            If Not .SelectCommand Is Nothing Then
                If Not .SelectCommand.Connection Is Nothing Then
                    .SelectCommand.Connection.Dispose()
                End If
                .SelectCommand.Dispose()
            End If
            .Dispose()
        End Try
    End With
 FillBookData = data
End Function
SPROC
SQL 存储过程的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Database/Sql/d7_sprocs.sql 文件。
注意   如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS。
GetBooksByCategoryId SPROC:
--------------------------------------------------
-- GetBooksByCategoryId
--------------------------------------------------
CREATE PROCEDURE GetBooksByCategoryId
    @CategoryId INT
AS
    SET NOCOUNT ON

    SELECT TOP 50
           i.PKId,
           i.TypeId,
           b.PublisherId,
           b.ISBN,
           i.ImageFileSpec,
           i.Name 'Title',
           i.Description,
           i.UnitPrice,
           i.UnitCost,
           t.Name 'ItemType',
           p.Name 'PublisherName'
      FROM Items i,
           Books b,
           ItemCategory c,
           ItemType t,
           Publishers p
     WHERE c.CategoryId = @CategoryId
       AND i.PKId = c.ItemId
       AND b.ItemId= i.PKId
       AND p.PKId = b.PublisherId
       AND t.PKId = i.TypeId
  ORDER BY i.PKId

    RETURN 0
GetDailyPickBooksByCategoryId SPROC:
--------------------------------------------------
-- GetDailyPickBooksByCategoryId
--------------------------------------------------
CREATE PROCEDURE GetDailyPickBooksByCategoryId
    @CategoryId INT
AS
    SET NOCOUNT ON

    SELECT TOP 50
           i.PKId,
           i.TypeId,
           b.PublisherId,
           b.ISBN,
           i.ImageFileSpec,
           i.Name 'Title',
           i.Description,
           i.UnitPrice,
           i.UnitCost,
           t.Name 'ItemType',
           p.Name 'PublisherName'
      FROM Items i,
           Books b,
           DailyPick c,
           ItemType t,
           Publishers p
     WHERE c.CategoryId = @CategoryId
       AND i.PKId = c.ItemId
       AND b.ItemId= i.PKId
       AND p.PKId = b.PublisherId
       AND t.PKId = i.TypeId
  ORDER BY i.PKId

    RETURN 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值