Petshop4学习

Petshop4 的钻研分析
http://blog.csdn.net/sjklove/archive/2006/11/10/1377405.aspx
1.品种概述与架构分析
微软巧推出了按照ASP.NET 2.0下之Pet Shop 4,
该本有了一个崭新的用户界面。是探讨ASP.NET
2.0的好范例啊,大家还领会,一贯以来,在.NET和Java之间争辩不休,到底以什么人平台开发之柜级应用性能最好、结构最美妙、生产力最高。为了用实际讲,通过对品种每面的性质评估进而在相比.NET和Java的输赢。用户做相比较的此项目就是Petshop。正因为Petshop肩负着下面所说的使命,各面无法不是绝妙的,架构设计应该是由此慎重考虑的。所以其只要推出,便成为了开发者、架构师等人口读书、研究的榜样。

近期微软生产了基于.NET Framework 2.0出之Petshop
4。新的Petshop4实现了与Petshop 3相同甚至又多之特性,由于应用了Master
Pages,Membership,以及Profile,SqlCacheDependency,不过代码量却收缩了四分之一。同时,在业务、数据缓存、安全者拔取了.NET
2.0附带的特征,构建了一个活的特等实践的应用程序。

 SQL Server 1

她们利用了Project Conversion Wizard把品种从ASP.NET 1.1移植到了ASP.NET
2.0,然后做了以下改变:

1.为此System.Transactions代替了原的瑟维斯(Service)(Service)d Components提供的事情功用

代码实现:PetShop.BLL.OrderSynchronous 的 public void
Insert(PetShop.Model.OrderInfo order)。

2.据此强类型的范型集合代替了原的弱类型集合

        public IList<ProductInfo> GetProductsByCategory(string
category)

        {

            // Return new if the string is empty

            if (string.IsNullOrEmpty(category))

                return new List<ProductInfo>();

 

            // Run a search against the data store

            return dal.GetProductsByCategory(category);

        }

3.用ASP.NET 2.0 Membership来进行表明与授权

4.创办了针对Oracle 10g的Custom  ASP.NET 2.0 Membership Provider

5.用到ASP.NET 2.0的Custom Oracle 和 SQL Server Profile Providers
做用户状态管理,包括购物车等

6.接纳了Master Pages,取代了原的用户控件,来实现统一之界面效果

7.运了ASP.NET 2.0 Wizard控件实现check-out

8.以了SqlCacheDependency来实现数据库层次的缓存更新(cache
invalidation)功用

9.下了音讯队列来落实异时订单处理。

 

2.圆架构:

SQL Server 2
数据库:(暂略)

品种列表:从总体雅观来,Pet Shop
4的体系体系就充足庞大,考虑的上边为比3.0再一次周详复杂。

SQL Server 3

 

序号

项目名称

描述

1

BLL

业务逻辑层

2

CacheDependencyFactory

缓存依赖类的工厂类

3

WEB

表示层

4

DALFactory

数据层的抽象工厂

5

DBUtility

数据访问类组件

6

IBLLStrategy

同步/异步策略接口

7

ICacheDependency

缓存依赖类接口

8

IDAL

数据访问层接口定义

9

IMessaging

异时处理消息队列接口定义

10

IProfileDAL

Profile的数据访问层接口定义

11

Membership

Membership认证和授权管理

12

MessagingFactory

异时处理消息队列的抽象工厂

13

Model

业务实体

14

MSMQMessaging

异时处理消息队列的实现

15

OracleDAL

Oracle数据访问层

16

OracleProfileDAL

Oracle的Profile Providers

做用户状态管理,包括购物车等

17

OrderProcessor

后台处理进程,处理订单队列

18

Profile

Profile的数据访问层

19

ProfileDALFactory

ProfileDAL的工厂类(反射创建ProfileDAL)

20

SQLProfileDAL

SQL Server 的Profile Providers

做用户状态管理,包括购物车等

21

SQLServerDAL

SQLServer数据访问层

22

TableCacheDependency

缓存依赖实现类

 

列表明:

是因为全部已经起22只项目,所以,对于新家一看就迷糊了,所以,我举办了说,可以大概上划分几片去解。

序号

项目名称

描述

1

WEB

表示层

2

Model

业务实体

3

BLL

业务逻辑层

4

DALFactory

数据层的抽象工厂

5

IDAL

数据访问层接口定义

6

SQLServerDAL

SQLServer数据访问层

7

OracleDAL

Oracle数据访问层

8

DBUtility

数据库访问组件基础类

9

CacheDependencyFactory

缓存依赖类的工厂类

10

ICacheDependency

缓存依赖类接口

11

TableCacheDependency

缓存依赖实现类

12

IBLLStrategy

同步/异步处理策略接口(实现在bll根据配置反射选择)

13

MessagingFactory

异时处理消息队列的抽象工厂

14

IMessaging

异时处理消息队列接口定义

15

MSMQMessaging

异时处理消息队列的实现

16

Profile

Profile的数据访问层

17

ProfileDALFactory

ProfileDAL的工厂类(反射创建ProfileDAL)

18

IProfileDAL

Profile的数据访问层接口定义

19

OracleProfileDAL

Oracle的Profile Providers

做用户状态管理

20

SQLProfileDAL

SQL Server 的Profile Providers

做用户状态管理

21

Membership

Membership认证和授权管理

22

OrderProcessor

后台处理进程,处理订单队列

 

SQL Server 4

 

 

3.Petshop 4中的设计格局:

厂子格局:

英雄的哪怕是工厂情势,很轻就可以看出来,也是应用最多的。

DALFactory:数据访问层的架空工厂(决定创设哪个种类数据库类型的数额访问层。可以挑选:SQLServer,Oracle)

CacheDependencyFactory:缓存看重类的厂子类。(成立具体表的缓存依赖)

MessagingFactory
:异时处理音讯队列的架空工厂(反射成立具体的异时处理类)

ProfileDALFactory:ProfileDAL的厂子类(反射采取创制Oracle 和SQL Server的
ProfileDAL)

 

方针格局: IorderStrategy

 

 

SQL Server 5 

 

中介情势

CategoryDataProxy ItemDataProxy  ProductDataProxy

 

 

 SQL Server 6

临时就看了这般多,未来发生工夫继续解释,假诺您来异的理念或更,也要写下来,好给大家来共同学习,共同探索,共同提升。

 

(作者:李天平  转载请注脚)

 

具体介绍好参照MSDN

.NET Pet
Shop 4: Migrating an ASP.NET 1.1 Application to 2.0

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp

 

下载

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

17:18 |
コメントの投稿 |
固定リンク |
トラックバック
(0)
 |
この記事を引用😉 |
VB

Pet Shop 4

Pet Shop
4

(http://kentyshang.cnblogs.com/)

Microsoft .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0

 

披露日期: 2006-5-9 | 更新日期: 2006-5-9

适用于:
Microsoft .NET Framework 2.0
Microsoft Visual Studio 2005
Microsoft Windows Server 2003
Microsoft InterNET Information Services
Microsoft Message Queuing
Microsoft SQL Server 2005
Oracle 10G Database

摘要:.NET Pet Shop 应用程序的设计表明了构建公司 n 层 .NET 2.0
应用程序的特等做法,这种应用程序可能用帮忙各类数据库平台和配置方案。

单击此处下载
.NET Pet Shop 4.0.msi。

SQL Server 7

本页内容
概述
工作效率
从 ASP.NET 1.1 迁移到 2.0
体系结构
抽象工厂模式
用户界面增强
加密配置信息
模型对象
Order 和 Inventory 架构
Profile 数据库架构
小结

概述

.NET Pet Shop 应用程序的设计表明了构建集团 n 层 .NET 2.0
应用程序的特级做法,这种应用程序可能需要襄助各样数据库平台与配置方案。

.NET Pet Shop 4 项目之靶子是:

工作效率:减少了 .NET Pet Shop 3 的代码数量 – 我们减少了近 25% 的代码。

从 ASP.NET 1.1 迁移到 2.0:利用 ASP.NET 2.0 的新功能 – 我们利用母版页、成员身份和配置文件,并设计出一个新的、吸引人的用户界面。

图 1. .NET Pet Shop 4.0

企业体系结构:构建一个灵活的最佳做法应用程序 – 我们实现了设计模式,以及表示层、业务层和数据层的分离。

SQL Server 8返页首

工作功能

和 .NET Pet Shop 3 相比,.NET Pet Shop 4 中之代码量约缩短了近乎
25%。减弱代码行数的紧要利益展现于象征层以及数码访问层。

于表示层,大家减了大约 25% 的代码。登录和签出步骤相比较完的 ASP.NET
页面重新精简,需要的代码和 html
更不见。这是为带控件本身处理过程流代码。使用母版页意味着使用相比较少之
html 代码和用户控件管理布局。相相比叫 Pet Shop 3
用户管理代码,成员身份服务处理身份验证的法子更简洁。

咱俩视数据层节省的代码量最多,高臻 36%。ASP.NET 2.0 SQL
成员身份供程序取代了帐户管理代码。

表 1 被出逐层分解的完全代码量。

表 1. .NET Pet Shop 版本 3 与本 4 的代码量比较

 

v3

v4

表示层

1,822

1,365

模型

349

395

事情逻辑层

210

199

数据访问层

1,538

985

代码总行多次

3,919

2,944

希冀 2 对斯开了一发的图解。

SQL Server 9

祈求 2. 代码量相比图

.NET Pet Shop 4 引入了几单新职能,包括打定义之 ASP.NET 2.0
配置文件提供次,以及经 MSMQ 举办的异步定单处理等。表 2
展现新职能的代码数量:

表 2. .NET Pet Shop 4 新力量的代码量

起定义配置文件

853

Oracle 成员身份

586

缓存依赖项

90

音讯队列

147

代码总行多次

1,676

SQL Server 10返页首

从 ASP.NET 1.1 迁移到 2.0

为了落实 .NET Pet Shop 4 的靶子,我们制订了下列计划:

使用项目转换向导将 .NET Pet Shop 3.2 代码基从 ASP.NET 1.1 移植到 ASP.NET 2.0。

规划我们想要包括的 ASP.NET 2.0 功能。

实现一个支持这些功能的 n 层体系结构。

品类转移向导

首先,Visual Studio.NET 2005 项目转移向导连忙进步 .NET Pet Shop 3.2
代码基。通过这同样主导移植,大家会起初通晓经编译并于 ASP.NET 2.0
上运行的 .NET Pet Shop 3.2。

本子 3 和版本 4 之间的扭转

因而提高 .NET Pet Shop 3.2 代码基以便在.NET Framework 2.0 上运行及针对性
ASP.NET 2.0 的钻,大家生产了使以 .NET Pet Shop 4.0
中落实的以下重点效能:

用 System.Transactions 代替服务组件。

用强类型集合的泛型代替松散类型的 ILists。

ASP.NET 2.0 成员身份,用于用户身份验证和授权。

用于 Oracle 10G 的自定义 ASP.NET 2.0 成员身份提供程序。

ASP.NET 2.0 自定义 Oracle 和 SQL Server 配置文件提供程序,用于用户状态管理。

用母版页取代 ASP.NET Web 用户控件,从而获得一致的外观。

ASP.NET 2.0 向导控件。

使用 SqlCacheDependency(而非基于超时)的数据库级缓存失效。

启用基于消息队列构建的异步 Order 处理。

什么是 System.Transactions?

System.Transactions 是 .NET 2.0
框架中新增的事情控件命名空间。它是如出一辙栽处理分布式事务之初点子,没有 COM+
注册与 COM+ 目录的支付。请留心,Microsoft
分布式事务协调器用于起始化事务。

运行情形

并定单处理倍受的
Order.Insert() 方法应用 System.Transactions
插入一个定单并革新库存。通过抬高对 System.Transaction
命名空间的援,并以定单插入方法和库存缩短方法包装在 TransactionScope
内,大家实现了 Order.Insert() 方法,如代码清单 1 所示。

清单 1. 运转面临之 System.Transactions

using System;using System.Transactions;using PetShop.IBLLStrategy;namespace PetShop.BLL {/// <summary>/// This is a synchronous implementation of IOrderStrategy/// By implementing IOrderStrategy interface, the developer can/// add a new order insert strategy without re-compiling the whole/// BLL./// </summary>public class OrderSynchronous : IOrderStrategy {.../// <summary>/// Inserts the order and updates the inventory stock within/// a transaction./// </summary>/// <param name="order">All information about the order</param>public void Insert(PetShop.Model.OrderInfo order) {using (TransactionScope ts = newTransactionScope(TransactionScopeOption.Required)) {dal.Insert(order);// Update the inventory to reflect the current inventory// after the order submission.Inventory inventory = new Inventory();inventory.TakeStock(order.LineItems);// Calling Complete commits the transaction.// Excluding this call by the end of TransactionScope's// scope will rollback the transaction.ts.Complete();}}}}

于 .NET Pet Shop 3 中,分布式事务由局劳动处理,需要 COM+
注册。OrderInsert 类从劳动组件派生,事务由 COM+ 处理。然后,服务组件使用
regsvr32 命令进行注册。

清单 2. Pet Shop 3 的定单插入

using System;using System.Collections;using System.EnterpriseServices;using System.Runtime.InteropServices;...namespace PetShop.BLL {/// <summary>/// A business component to manage the creation of orders/// Creation of an order requires a distributed transaction/// so the Order class derives from ServicedComponents/// </summary>[Transaction(System.EnterpriseServices.TransactionOption.Required)][ClassInterface(ClassInterfaceType.AutoDispatch)][ObjectPooling(MinPoolSize=4, MaxPoolSize=4)][Guid("14E3573D-78C8-4220-9649-BA490DB7B78D")]public class OrderInsert : ServicedComponent {.../// <summary>/// A method to insert a new order into the system/// The orderId will be generated within the method and should not/// be supplied as part of the order creation the inventory will be/// reduced by the quantity ordered./// </summary>/// <param name="order">All the information about the order</param>/// <returns>/// The new orderId is returned in the order object/// </returns>[AutoComplete]public int Insert(OrderInfo order) {// Get an instance of the Order DAL using the DALFactoryIOrder dal = PetShop.DALFactory.Order.Create();// Call the insert method in the DAL to insert the headerint orderId = dal.Insert(order);// Get an instance of the Inventory business componentInventory inventory = new Inventory();inventory.TakeStock( order.LineItems);...// Set the orderId so that it can be returned to the callerreturn orderId;}}}

System.Transactions 的优点

由店铺劳动活动到 System.Transactions 可以简化部署,因为后者不需要动用
COM+ 目录。使用 COM+
目录时,大家忽略了外一些万分的效益,只保留了分布式事务辅助。System.Transaction
使得在 ASP.NET 2.0
应用程序中编程和配置分布式应用程序变得不可开交略。System.Transactions
在运行时之性进步了 50%,因为它避免了目的实例化的 COM+
目录查找所来的出。最终一个独到之处是,针对 SQL Server 2005
运行时,System.Transactions 可以检测到某个分布式事务什么时候针对宿主在一个
SQL Server 2005
实例上的有数独不同数据库运行。在那种状态下,它亦可将拖欠分布式事务提高为一个本地工作,这样就不过免和分布式事务登录/两路提交有关的周支,从而极大地提升性能。

泛型

SQL Server,哎呀是泛型?

历次返一个 Pet Shop
模型对象
相会时,我们且针对该对象下泛型类型的一个集列表。这是
C# 2.0 的一个激增功能,称之为泛型。

运行情状

俺们好打清单 3 所显示之 GetProductsByCategory 方法中来看泛型的运行状态。

清单 3. Product.cs (Pet Shop 4.0)

      /// <summary>/// A method to retrieve products by category name/// </summary>/// <param name="order">The category name to search by</param>/// <returns>A Generic List of ProductInfo</returns>public IList<ProductInfo>GetProductsByCategory(string category) {// Return new if the string is emptyif (string.IsNullOrEmpty(category))return new List<ProductInfo>();// Run a search against the data storereturn dal.GetProductsByCategory(category);}

以下是 Pet Shop 3 中的一致代码,它回到一个 IList:

清单 4. Product.cs (Pet Shop 3)

      /// <summary>/// A method to retrieve products by category name/// </summary>/// <param name="order">The category name to search by</param>/// <returns>/// An interface to an arraylist of the search results/// </returns>public IList GetProductsByCategory(string category) {// Return null if the string is emptyif (category.Trim() == string.Empty)return null;// Get an instance of the Product DAL using the DALFactoryIProduct dal = PetShop.DALFactory.Product.Create();// Run a search against the data storereturn dal.GetProductsByCategory(category);}

泛型的亮点

泛型允许我们回来对象的强类型集合,而休是 .NET Pet Shop 3 中之 IList
集合。泛型强类型集合提供品类安全,其特性优于一般的会合。此外,泛型强类型集合将当
Visual Studio 2005 AMDlisense 中冒出,这可增长开发人士工作功能。

ASP.NET 2.0 成员身价

分子身份供一个通用的用户身份验证和管制框架。当用户音讯存储于 SQL
Server 中不时,.NET Pet Shop 4 接纳 SQL Server
成员身价供次;当用户音信存储在 Oracle 中平时,.NET Pet Shop 4
应用于定义成员身份供程序。

运转处境

假定以 .NET Pet Shop 4 中实现成员身价,需要执行以下步骤:

配置窗体身份验证。

<authentication mode="Forms">            <forms name="PetShopAuth" loginUrl="SignIn.aspx"            protection="None" timeout="60"/>            </authentication>            

要使用 SQL 成员身份提供程序,我们必须安装成员身份数据库。成员身份数据库是在运行下列命令时由 ASP.NET 创建的。

%WinDir%\Microsoft.NET\Framework\<.NET version>\aspnet_regsql            -S <server\instance> -E -A all -d MSPetShop4Services            

配置 SQL 成员身份提供程序。

<membership defaultProvider="SQLMembershipProvider">            <providers>            <add name="SQLMembershipProvider"            type="System.Web.Security.SqlMembershipProvider"            connectionStringName="SQLMembershipConnString"            applicationName=".NET Pet Shop 4.0"            enablePasswordRetrieval="false"            enablePasswordReset="true"            requiresQuestionAndAnswer="false"            requiresUniqueEmail="false"            passwordFormat="Hashed"/>            </providers>            </membership>            

ASP.NET Login 控件封装所有登录逻辑。CreateUserWizard 控件处理新的用户注册。

ASP.NET 2.0 成员身份的独到之处

经成员身份服务,我们能采纳预建的用户身份验证和登记控件,而不论需开编写这多少个控件。最终结出是:为报到、登录状态、用户身份、用户注册和密码復苏编写的代码变少了。

并且,由于成员身价现在驻留于投机之数据库被,由此我们可以去 .NET Pet
Shop 3 中行使的 Accounts 表,然后用 ASP.NET 2.0
成立的成员身份服务数据库。

用以 Oracle 10G的自定义成员身价供程序

.NET 2.0 框架包括一个 SQL Server 成员身份供程序。为了在应用程序使用
Oracle 成员身份数据库时保留用户帐户,我们为 Oracle
成立了一个自定义成员身份供程序实现。大家无非实现了由 .NET Pet Shop 4
动的措施,即 CreateUser 方法和 Login 方法。但是,任何期待用
Oracle10G同 ASP.NET
成员身价服务联合行使的用户都得接纳以及/或扩张该代码。

运转情形

CreateUser 方法是 MembershipProvider 类的实现的章程之一。它深远商讨OracleMembershipProvider 的劳作措施。

清单 5. OracleMembershipProvider.cs CreateUser(…)

using System;using System.Configuration.Provider;namespace PetShop.Membership {class OracleMembershipProvider : MembershipProvider {string password, string email, string passwordQuestion,string passwordAnswer, bool isApproved, object userId,out MembershipCreateStatus status) {// create connectionOracleConnection connection =new OracleConnection(OracleHelper.ConnectionStringMembership);connection.Open();OracleTransaction transaction =connection.BeginTransaction(IsolationLevel.ReadCommitted);try {DateTime dt = DateTime.Now;bool isUserNew = true;// Step 1: Check if the user exists in the Users// table: Create if notint uid = GetUserID(transaction, applicationId, username, true,false, dt, out isUserNew);if (uid == 0) { // User not created successfully!status = MembershipCreateStatus.ProviderError;return null;}// Step 2: Check if the user exists in the Membership table: Error// if yesif (IsUserInMembership(transaction, uid)) {status = MembershipCreateStatus.DuplicateUserName;return null;}// Step 3: Check if Email is duplicateif (IsEmailInMembership(transaction, email, applicationId)) {status = MembershipCreateStatus.DuplicateEmail;return null;}// Step 4: Create user in Membership tableint pFormat = (int)passwordFormat;if (!InsertUser(transaction, uid, email, pass, pFormat, salt, "","", isApproved, dt)) {status = MembershipCreateStatus.ProviderError;return null;}// Step 5: Update activity date if user is not newif(!isUserNew) {if(!UpdateLastActivityDate(transaction, uid, dt)) {status = MembershipCreateStatus.ProviderError;return null;}}status = MembershipCreateStatus.Success;return new MembershipUser(this.Name, username, uid, email,passwordQuestion, null, isApproved,false, dt, dt, dt, dt, DateTime.MinValue);}catch(Exception) {if(status == MembershipCreateStatus.Success)status = MembershipCreateStatus.ProviderError;throw;}finally {if(status == MembershipCreateStatus.Success)transaction.Commit();elsetransaction.Rollback();connection.Close();connection.Dispose();}}

匪实现的道成为空存根,如下所示:

public override string GetUserNameByEmail(string email) {throw new Exception("The method or operation is not implemented.");}

Oracle 10G成员身价供次的独到之处

由于我们目的在于 .NET Pet Shop 4 将成员身份数据存储在 Oracle 数据库和 SQL
Server
中,由此我们兑现了一个自定义的分子身价供程序。提供次模型如若我们会以
Oracle 数据库和 ASP.NET 2.0 成员身份服务开展简短、急速地拼。

ASP.NET 2.0 配置文件

于 ASP.NET 2.0 中,可过多单 Web 应用程序,将用户新闻囤积到一个名也
Profile 的初劳动受到。.NET Pet Shop 4
的配备文件落实存储并找用户的购物车、购物清单及帐户音讯。这里的严重性的一些凡是,很多用户会发现,尽管为用户会话音信提供一个事务处理、集群安全的贮存,这几可了替换他们对会话对象的运用。默认情形下,配置文件服务以数据列化为一个
BLOB,存储于数据库中。可是,通过落实公自己的布局文件服务体系化服务可获更胜的性能。对于
Pet Shop 4,创造了一个安排文件服务的自定义实现来降低系列化开销。

运转情状

配置配置文件提供程序。

清单 6. 配置文件提供程序配置

<profile automaticSaveEnabled="false"            defaultProvider="ShoppingCartProvider">            <providers>            <add name="ShoppingCartProvider"            connectionStringName="SQLProfileConnString"            type="PetShop.Profile.PetShopProfileProvider"            applicationName=".NET Pet Shop 4.0"/>            <add name="WishListProvider"            connectionStringName="SQLProfileConnString"            type="PetShop.Profile.PetShopProfileProvider"            applicationName=".NET Pet Shop 4.0"/>            <add name="AccountInfoProvider"            connectionStringName="SQLProfileConnString"            type="PetShop.Profile.PetShopProfileProvider"            applicationName=".NET Pet Shop 4.0"/>            </providers>            <properties>            <add name="ShoppingCart" type="PetShop.BLL.Cart"            allowAnonymous="true" provider="ShoppingCartProvider"/>            <add name="WishList" type="PetShop.BLL.Cart"            allowAnonymous="true"            provider="WishListProvider"/>            <add name="AccountInfo" type="PetShop.Model.AddressInfo"            allowAnonymous="false" provider="AccountInfoProvider"/>            </properties>            </profile>            

迁移匿名配置文件。

清单 7. 迁移匿名配置文件

// Carry over profile property values from an anonymous to an            // authenticated state            void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs e) {            ProfileCommon anonProfile = Profile.GetProfile(e.AnonymousID);            // Merge anonymous shopping cart items to the authenticated            // shopping cart items            foreach (CartItemInfo cartItem in            anonProfile.ShoppingCart.CartItems)            Profile.ShoppingCart.Add(cartItem);            // Merge anonymous wishlist items to the authenticated wishlist            // items            foreach (CartItemInfo cartItem in anonProfile.WishList.CartItems)            Profile.WishList.Add(cartItem);            // Clean up anonymous profile            ProfileManager.DeleteProfile(e.AnonymousID);            AnonymousIdentificationModule.ClearAnonymousIdentifier();            // Save profile            Profile.Save();            }            

清单 8. 购物车

using System;            using System.Collections.Generic;            using PetShop.Model;            namespace PetShop.BLL {            /// <summary>            /// An object to represent a customer's shopping cart.            /// This class is also used to keep track of customer's wish list.            /// </summary>            [Serializable]            public class Cart {            // Internal storage for a cart            private Dictionary cartItems =            new Dictionary();            /// <summary>            /// Calculate the total for all the cartItems in the Cart            /// </summary>            public decimal Total {            get {            decimal total = 0;            foreach (CartItemInfo item in cartItems.Values)            total += item.Price * item.Quantity;            return total;            }            }            /// <summary>            /// Update the quantity for item that exists in the cart            /// </summary>            /// Item Id            /// Quantity            public void SetQuantity(string itemId, int qty) {            cartItems[itemId].Quantity = qty;            }            /// <summary>            /// Return the number of unique items in cart            /// </summary>            public int Count {            get { return cartItems.Count; }            }            /// <summary>            /// Add an item to the cart.            /// When ItemId to be added has already existed, this method            /// will update the quantity instead.            /// </summary>            /// Item Id of item to add            public void Add(string itemId) {            CartItemInfo cartItem;            if (!cartItems.TryGetValue(itemId, out cartItem)) {            Item item = new Item();            ItemInfo data = item.GetItem(itemId);            if (data != null) {            CartItemInfo newItem = new CartItemInfo(itemId,            data.ProductName, 1, (decimal)data.Price,            data.Name, data.CategoryId, data.ProductId);            cartItems.Add(itemId, newItem);            }            }            else            cartItem.Quantity++;            }            /// <summary>            /// Add an item to the cart.            /// When ItemId to be added has already existed, this method            /// will update the quantity instead.            /// </summary>            /// Item to add            public void Add(CartItemInfo item) {            CartItemInfo cartItem;            if (!cartItems.TryGetValue(item.ItemId, out cartItem))            cartItems.Add(item.ItemId, item);            else            cartItem.Quantity += item.Quantity;            }            /// <summary>            /// Remove item from the cart based on itemId            /// </summary>            /// ItemId of item to remove            public void Remove(string itemId) {            cartItems.Remove(itemId);            }            /// <summary>            /// Returns all items in the cart. Useful for looping through            /// the cart.            /// </summary>            /// Collection of CartItemInfo            public ICollection CartItems {            get { return cartItems.Values; }            }            /// <summary>            /// Method to convert all cart items to order line items            /// </summary>            /// A new array of order line items            public LineItemInfo[] GetOrderLineItems() {            LineItemInfo[] orderLineItems =            new LineItemInfo[cartItems.Count];            int lineNum = 0;            foreach (CartItemInfo item in cartItems.Values)            orderLineItems[lineNum] = new LineItemInfo(item.ItemId,            item.Name, ++lineNum, item.Quantity, item.Price);            return orderLineItems;            }            /// <summary>            /// Clear the cart            /// </summary>            public void Clear() {            cartItems.Clear();            }            }            }            

ASP.NET 2.0 配置文件之助益

运 ASP.NET
2.0,用户的购物车可以储存于数据库中并坚贞不屈保留,这样,如果用户两三上后还回来,他们仍然故我拥自己之购物车。另外,配置文件服务是”按需”提供的,而对话状态对象对另外引用它的页面,每页都使举办再加载;配置文件服务之一个优势是只于实际上得常才加载。

而且,使用安排文件效能,大家能起现有的 Pet Shop 3 数据库被去除 Account
表和 Profile 表,这样啊会促销扣作业逻辑层和多少访问层中的代码量。

母版页

ASP.NET 2.0 提供相同栽通过使用母版页保持总体 Web
站点外观一样的新技巧。.NET Pet Shop 4 母版页含标头、LoginView
控件、导航菜单和表现内容之 HTML。所有其他 Pet Shop Web 窗体都使 Pet
Shop 4 母版页。

运行意况

图 3 展示 .NET Pet Shop 4 母版页。

SQL Server 11

图 3. .NET Pet Shop 4 母版页

清单 9. 绑定母版页

<%@ Page AutoEventWireup="true" Language="C#"MasterPageFile="~/MasterPage.master" Title="Products"Inherits="PetShop.Web.Products" CodeFile="~/Products.aspx.cs" %>

ASP.NET 2.0 母版页的长处

运用母版页,大家能一味创制同栽布局,然后即可对富有 .NET Pet Shop
页重用该布局。开发中针对该布局的旁移都向来成效为母版页,其他页面更改的才关乎到情节。相反,通过以标头和导航栏封装于号称也
NavBar.ascx 的 ASP.NET 用户控件被,可以实现 .NET Pet Shop 3
中之用户界面。.NET Pet Shop 3 中的每个 Web 窗体都饱含用于控制布局之
NavBar 用户控件和 HTML。更改布局将涉及处理每个 Web 窗体上之 NavBar
用户控件,或改每个 Web 窗体上的 HTML。

ASP.NET 2.0 向导控件

.NET Pet Shop 4 中之签出过程包含在 CheckOut 页面上的一个 Wizard
控件被。Wizard 是一个初控件,它提供相同栽实现逐渐过程的初点子。Wizard
控件管理窗体间的领航、数据持久性和各国一样步之状态管理。

运行情形

SQL Server 12

图 4. 签出向导控件

ASP.NET 2.0 向导控件的亮点(单击图像查看大图像)

.NET Pet Shop 3 中之签出过程涉及一文山会海互动通信的 ASP.NET
页面。从购物车页面,用户可转移到签出页面;在签出页面,用户输入其账单音讯,最后系统处理定单。该流程由一个号称也
CartController 的自定义类控制,它使用会话状态管理步骤中的通信。

SQL Server 13

贪图 5. .NET Pet Shop 3 签出过程

采纳 Wizard 控件,只待比少的代码即可在 .NET Pet Shop 4
中落实签出,从而使该过程易得大简约。

数量库级缓存失效

SQL Cache Dependency 是 ASP.NET 2.0 的一个骤增对象,可用于在 SQL Server
中之数据变动时若缓存失效。Pet Shop 4 使用 SQL Cache Dependency
对象要目录、产品跟类缓存失效。

即便成可用之功能而言,Pet Shop
仅包含基于表的缓存看重项实现。开发人士可以透过扩展 CacheDependency
对象来促成自己的缓存失效机制。机制落实后,就可以从 Web.config 配置 Pet
Shop 4 的 CacheDependency。

吁留意,Pet Shop 4 的 SQL CacheDependency 仅仅是吧以 SQL Server
上运行而计划的。对于 Oracle,.NET Pet Shop 4 将赶回基于时间之恢复生机存过期。

运转情形

祈求 6 突显 SQL Server 的缓存看重项:

SQL Server 14

图 6. Pet Shop 表缓存依赖项

数量库级缓存失效的独到之处

动缓存失效,我们可以使显示的情与 Pet Shop
数据库中之数据保持一致,但是依照能实现中间层对象缓存的优势,从而降低中层及的运作时处理要求,以及缩小数据库调用。这样可提升应用程序的可伸缩性(它可处理还多并效用户),同时还可退数据库负载。

异步 Order 处理

我们发的别一样处变更是补加了一个摘,以安排定单过程应拿业务直接(同步)提交给数据库,仍旧该交由给指定的队,稍后再针对拖欠队中之定单举行拍卖(异步)。在异步定单处理过程中,倘诺用户提交了一个定单,该定单将入一个班。.NET
Pet Shop 4 有一个使存储在 Microsoft 信处理队列 (MSMQ)
中之落实。稍后,该定单队列能够由 Order
处理器控制台应用程序处理。该法的一个优势是,定才数据库甚至不用举行客户周转,就可知处理定单。由于
MSMQ
使用持久队列,由此不论需用户干涉仍能捕获所有定单,一旦处理应用程序和定单数据库再度上线,所有定单都将插入数据库被。

运转情形

以处理并同异步定单处理期间的算法改变,我们用政策形式。在政策形式被,发出定单的不二法门是打
BLL.Order.Insert 方法中分别出来的。遵照 OrderStrategy 的 Web.config
设置,使用了相应的 Insert 方法。默认情状下,.NET Pet Shop
配置也协运行。

假定布局 Order 策略,将 OrderStrategyClass 值从 OrderSynchronous 更改为
OrderAsynchronous。其它,对于异步定单处理,MSMQ 必须透过一个吗 Pet Shop
而制造的私房队列来启用,如下所示。

<add key="OrderStrategyClass" value="PetShop.BLL.OrderSynchronous"/><add key="OrderQueuePath" value="private queue path"/>

一起发出定单

贪图 7 表达并发出定单。当用户签出定单时,签出按钮单击事件处理程序调用
BLL 中的 Order Insert 方法。对于同发出定单,BLL Order 对象下
OrderSynchronousInsert 方法以新定单插入 Orders 数据库中,然后更新
Inventory 数据库以反映定单提交后的当下库存。

SQL Server 15

贪图 7. 联机发出定单

异步发出定单

图 8 表明异步发出定单。在 Web 站点上,假若用户单击 CheckOut
按钮,就会晤调用 BLL Order Insert 方法。可是,由于 OrderStrategy
是针对性异步配置的,所以选择 OrderAsynchronous 策略。OrderAsynchronous
插入方法间接以定单音讯发送到队中。

SQL Server 16

贪图 8. 异步发出

定单处理器

定单处理器是一个控制台应用程序,我们创立它的目标是吸收音讯处理实现中的定单,并将这些定单转录到
Order 数据库及 Inventory
数据库被。定单处理器为多线程模式运行,以批处理形式处理定单。它用同步定单策略将新定单插入到
Orders 数据库中,并减弱 Inventory 数据库被的价。

异步定单处理的长处

其他很多集团应用程序吗祭了异步定单处理。要想只要 .NET Pet Shop 4
在定单以多线程模式处理时性更美观,分离定单过程当成一栽艺术。

SQL Server 17回来页首

系布局

对于首版本的 .NET Pet
Shop,系列布局重要关注用户界面、应用程序逻辑和数码里的了分开。这无异于通通分离允许我们改变一个交汇的兑现,而不相会影响外层。例如,大家得改变数据库供应商,而不用更改业务逻辑代码。

祈求 9 中之图表表明 .NET Pet Shop 4 的尖端逻辑序列布局。表示层 (WEB)
包含各类用户界面元素。业务逻辑层 (BLL)
包含应用程序逻辑和作业组件。数据看层 (DAL)
负责与数据库交互,举办数据存储和查找。以下诸组成部分将官对各样层举行详尽谈论。

SQL Server 18

图 9. .NET Pet Shop 4 的系统布局图(单击图像查看大图像)

SQL Server 19回页首

抽象工厂情势

.NET Pet Shop 4
行使抽象工厂设计情势,该情势被的接口用于创建同序列有关或倚靠的对象,而无论是需点名其具体类。数据看层中发出一个拖欠情势之以身作则,其中包括对
IDAL、DAL 工厂、Oracle DAL 和 SQL Server DAL
的类。为缓存、库存以及定单数据看、音讯处理,以及部署文件数量看成立抽象工厂。

表示层

ASP.NET 2.0 包括多可以增进开发人员工作效能的放到效用。构建 .NET Pet
Shop 4 时,大家重规划了用户界面,从而得以拔取 ASP.NET 2.0
提供的新职能,如母版页、主旨、皮肤、Wizard 控件和 Login
控件。为了保存用户帐户,大家选择成员身份供次(而非是行使 ASP.NET
会讲话状态)存储用户的购物车和喜爱的制品。新的布置文件提供次可以储存可若编程和保管用户状态越来越简便易行的强类型购物车。使用有这一个效应,大家能急迅实现
Pet Shop 表示层反。

SQL Server 20回来页首

用户界面增强

.NET Pet Shop 4
彻底地显现出一致栽新外观。新的用户界面援助再度充裕之宠物目录,使用户可以还爱地查找和购买各样新宠物。更改
.NET Pet Shop 用户界面的外观后,我们对 .NET Pet Shop
提供的言传身教宠物很感兴趣。.NET Pet Shop
中本时有暴发企鹅、小虫、熊猫,甚至骨骼、恐龙和透亮底小猫!通过长购物清单、浏览途径记录及此外小功效,大家尚好改进购物心得。

SQL Server 21归来页首

加密布信息

.NET Framework 2.0
引入了一个让保障的安排效能,大家得以采纳该效率加密连接字符串。使用该意义,我们好加密敏感的数据库用户称及密码音讯。

当您采纳”full source and database install”选项时,.NET Pet Shop
安装程序将自行运行一段子脚本,以加密 Web.config 文件被储存的连日字符串。

万一以”source only”安装上举办配置加密,运行安装目录中之
EncryptWebConfig.bat 文件。

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASPNET_regiis.exe-pef "connectionStrings""C:\Program Files\Microsoft\.NET Pet Shop 4.0\Web"

工作逻辑层

.NET Pet Shop 4 的事情逻辑保留了 .NET Pet Shop 3 的多数政工逻辑,如
Model 对象及其使用方法。为数不多的变动包括利用泛型,异步发出定单,以及
System.Transactions 命名空间。

SQL Server 22回去页首

型对象

.NET Pet Shop 4 保留了 .NET Pet Shop 3 中的 Model
对象。这个目的是学数据库表结构的自定义轻量级类。它们当各国应用程序层之间共享为互动通信。例如,假如回去一个目录中之几近只活,大家便再次来到一个
Product Model 对象集合。

多少访问层

BLL 同数据访问层通信为访 Pet Shop 4 数据库被的数额。.NET Pet Shop 4
采取以下五只数据库:Inventory、Orders、Membership 以及 Profile。对于 .NET
Pet Shop 3,该版协助 Oracle 和 SQL Server 数据库。

SQL Server 23返页首

Order 和 Inventory 架构

.NET Pet Shop 4 中使用的 Orders 和 Inventory 的数据库架构是自 .NET Pet
Shop 3
移植而来的。删除了几个未用的字段。该数据库有为下表的全部结构:

SQL Server 24

图 10. Pet Shop Orders 数据库

SQL Server 25

图 11. Pet Shop Inventory 数据库

SQL Server 26回到页首

Profile 数据库架构

Profile
数据库用于存储特定于用户的新闻,如帐户消息以及购物车内容。该数据库有为下表的完全布局:

SQL Server 27

图 12. Pet Shop Profile 数据库

相关文章