PetShop 40构架与技术分析.docx

上传人:b****8 文档编号:9642871 上传时间:2023-05-20 格式:DOCX 页数:39 大小:417.72KB
下载 相关 举报
PetShop 40构架与技术分析.docx_第1页
第1页 / 共39页
PetShop 40构架与技术分析.docx_第2页
第2页 / 共39页
PetShop 40构架与技术分析.docx_第3页
第3页 / 共39页
PetShop 40构架与技术分析.docx_第4页
第4页 / 共39页
PetShop 40构架与技术分析.docx_第5页
第5页 / 共39页
PetShop 40构架与技术分析.docx_第6页
第6页 / 共39页
PetShop 40构架与技术分析.docx_第7页
第7页 / 共39页
PetShop 40构架与技术分析.docx_第8页
第8页 / 共39页
PetShop 40构架与技术分析.docx_第9页
第9页 / 共39页
PetShop 40构架与技术分析.docx_第10页
第10页 / 共39页
PetShop 40构架与技术分析.docx_第11页
第11页 / 共39页
PetShop 40构架与技术分析.docx_第12页
第12页 / 共39页
PetShop 40构架与技术分析.docx_第13页
第13页 / 共39页
PetShop 40构架与技术分析.docx_第14页
第14页 / 共39页
PetShop 40构架与技术分析.docx_第15页
第15页 / 共39页
PetShop 40构架与技术分析.docx_第16页
第16页 / 共39页
PetShop 40构架与技术分析.docx_第17页
第17页 / 共39页
PetShop 40构架与技术分析.docx_第18页
第18页 / 共39页
PetShop 40构架与技术分析.docx_第19页
第19页 / 共39页
PetShop 40构架与技术分析.docx_第20页
第20页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

PetShop 40构架与技术分析.docx

《PetShop 40构架与技术分析.docx》由会员分享,可在线阅读,更多相关《PetShop 40构架与技术分析.docx(39页珍藏版)》请在冰点文库上搜索。

PetShop 40构架与技术分析.docx

PetShop40构架与技术分析

目录

1、项目概述2

2、整体架构3

3、项目列表3

4、数据库设计5

5、数据库访问设计7

6、数据访问层结构10

7、业务逻辑层核心结构11

8、异步处理机制11

9、缓存处理12

10、相关设计模式15

11、MSMQ消息处理16

12、事务处理23

13、泛型24

14、异常处理和log的使用25

15、Profile技术26

PetShop4.0构架与技术分析

1、项目概述

日前微软推出了基于.NETFramework2.0开发的Petshop4。

新的Petshop4实现了与Petshop3相同甚至更多的特性,由于采用了MasterPages,Membership,以及Profile,SqlCacheDependency,但是代码量却减少了四分之一。

同时,在事务、数据缓存、安全方面使用了.NET2.0附带的特性,构建了一个灵活的最佳实践的应用程序。

他们利用了ProjectConversionWizard把项目从ASP.NET1.1移植到了ASP.NET2.0,然后做了以下改动:

 1.用System.Transactions代替了原来的ServicedComponents提供的事务功能

代码实现:

PetShop.BLL.OrderSynchronous的publicvoidInsert(PetShop.Model.OrderInfoorder)。

2.用强类型的范型集合代替了原来的弱类型集合

publicIListGetProductsByCategory(stringcategory)

{

//Returnnewifthestringisempty

if(string.IsNullOrEmpty(category))

returnnewList();

//Runasearchagainstthedatastore

returndal.GetProductsByCategory(category);

}

3.采用ASP.NET2.0Membership来做认证和授权

4.创建了针对Oracle10g的CustomASP.NET2.0MembershipProvider

5.利用ASP.NET2.0的Customoracle和SQLServerProfileProviders做用户状态管理,包括购物车等

6.采用了MasterPages,取代了原来的用户控件,来实现统一的界面效果

7.使用了ASP.NET2.0Wizard控件实现check-out

8.使用了SqlCacheDependency来实现数据库层次的缓存更新(cacheinvalidation)功能

9.使用了消息队列来实现异时订单处理。

2、整体架构

PetShop4.0基本上延续了3.0的结构,但在性能上作了一定的改进,引入了缓存和异步处理机制,同时又充分利用了ASP.Net2.0的新功能MemberShip,因此PetShop4.0的系统架构图如下所示:

3、项目列表

从整体可以看出,PetShop4的项目体系已经很庞大,考虑的方面也较3.0更全面复杂。

由于整体已经有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的ProfileProviders做用户状态管理

20

SQLProfileDAL

SQLServer的ProfileProviders做用户状态管理

21

Membership

Membership认证和授权管理

22

OrderProcessor

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

4、数据库设计

为了提高数据访问效率,PetShop采用了分库处理方式,使用以下四个数据库:

Inventory、Orders、Membership和Profile。

Order和Inventory数据库具有以下表的总体结构:

PetShopOrders数据库

PetShopInventory数据库

 

Profile数据库用于存储特定于用户的信息,如帐户信息和购物车内容。

该数据库具有以下表的总体结构:

PetShopProfile数据库

5、数据库访问设计

在PetShop中,系统需要处理的数据库对象分为两类:

一是数据实体,对应数据库中相应的数据表。

它们没有行为,仅用于表现对象的数据。

这些实体类都被放到Model程序集中,例如数据表Order对应的实体类OrderInfo,其类图如下:

 

       这些对象并不具有持久化的功能,简单地说,它们是作为数据的载体,便于业务逻辑针对相应数据表进行读/写操作。

虽然这些类的属性分别映射了数据表的列,而每一个对象实例也恰恰对应于数据表的每一行,但这些实体类却并不具备对应的数据库访问能力。

       由于数据访问层和业务逻辑层都将对这些数据实体进行操作,因此程序集Model会被这两层的模块所引用。

      第二类数据库对象则是数据的业务逻辑对象。

这里所指的业务逻辑,并非业务逻辑层意义上的领域(domain)业务逻辑(从这个意义上,我更倾向于将业务逻辑层称为“领域逻辑层”),一般意义上说,这些业务逻辑即为基本的数据库操作,包括Select,Insert,Update和Delete。

由于这些业务逻辑对象,仅具有行为而与数据无关,因此它们均被抽象为一个单独的接口模块IDAL,例如数据表Order对应的接口IOrder:

       将数据实体与相关的数据库操作分离出来,符合面向对象的精神。

首先,它体现了“职责分离”的原则。

将数据实体与其行为分开,使得两者之间依赖减弱,当数据行为发生改变时,并不影响Model模块中的数据实体对象,避免了因一个类职责过多、过大,从而导致该类的引用者发生“灾难性”的影响。

其次,它体现了“抽象”的精神,或者说是“面向接口编程”的最佳体现。

抽象的接口模块IDAL,与具体的数据库访问实现完全隔离。

这种与实现无关的设计,保证了系统的可扩展性,同时也保证了数据库的可移植性。

在PetShop中,可以支持SQLServer和Oracle,那么它们具体的实现就分别放在两个不同的模块SQLServerDAL、OracleDAL中。

       以Order为例,在SQLServerDAL、OracleDAL两个模块中,有不同的实现,但它们同时又都实现了IOrder接口,如图:

 

 从数据库的实现来看,PetShop体现出了没有ORM框架的臃肿与丑陋。

由于要对数据表进行Insert和Select操作,以SQLServer为例,就使用了SqlCommand,SqlParameter,SqlDataReader等对象,以完成这些操作。

尤其复杂的是Parameter的传递,在PetShop中,使用了大量的字符串常量来保存参数的名称。

此外,PetShop还专门为SQLServer和Oracle提供了抽象的Helper类,包装了一些常用的操作,如ExecuteNonQuery、ExecuteReader等方法。

在没有ORM的情况下,使用Helper类是一个比较好的策略,利用它来完成数据库基本操作的封装,可以减少很多和数据库操作有关的代码,这体现了对象复用的原则。

PetShop将这些Helper类统一放到DBUtility模块中,不同数据库的Helper类暴露的方法基本相同,只除了一些特殊的要求,例如Oracle中处理bool类型的方式就和SQLServer不同,从而专门提供了OraBit和OraBool方法。

此外,Helper类中的方法均为static方法,以利于调用。

OracleHelper的类图如下:

6、数据访问层结构

数据访问层(DAL)中,采用DALInterface抽象出数据访问逻辑,并以DALFactory作为数据访问层对象的工厂模块。

对于DALInterface而言,分别有支持MS-SQL的SQLServerDAL和支持Oracle的OracleDAL具体实现。

而Model模块则包含了数据实体对象。

其详细的模块结构图如下所示:

可以看到,在数据访问层中,完全采用了“面向接口编程”思想。

抽象出来的IDAL模块,脱离了与具体数据库的依赖,从而使得整个数据访问层利于数据库迁移。

DALFactory模块专门管理DAL对象的创建,便于业务逻辑层访问。

SQLServerDAL和OracleDAL模块均实现IDAL模块的接口,其中包含的逻辑就是对数据库的Select,Insert,Update和Delete操作。

因为数据库类型的不同,对数据库的操作也有所不同,代码也会因此有所区别。

7、业务逻辑层核心结构

抽象出来的IDAL模块,除了解除了向下的依赖之外,对于其上的业务逻辑层,同样仅存在弱依赖关系,如下图所示:

业务逻辑层的核心模块,它包含了整个系统的核心业务。

在业务逻辑层中,不能直接访问数据库,而必须通过数据访问层。

注意图中对数据访问业务的调用,是通过接口模块IDAL来完成的。

既然与具体的数据访问逻辑无关,则层与层之间的关系就是松散耦合的。

如果此时需要修改数据访问层的具体实现,只要不涉及到IDAL的接口定义,那么业务逻辑层就不会受到任何影响。

毕竟,具体实现的SQLServerDAL和OracalDAL根本就与业务逻辑层没有半点关系。

8、异步处理机制

在PetShop4.0中引入了异步处理机制。

数据访问层的Messaging模块,是为异步插入订单的功能提供,采用了MSMQ(MicrosoftMessagingQueue)技术。

插入订单的策略可以分为同步和异步,两者的插入策略明显不同,但对于调用者而言,插入订单的接口是完全一样的,所以PetShop4.0中设计了IBBLStrategy模块。

虽然在IBBLStrategy模块中,仅仅是简单的IOrderStategy,但同时也给出了一个范例和信息,那就是在业务逻辑的处理中,如果存在业务操作的多样化,或者是今后可能的变化,均应利用抽象的原理。

或者使用接口,或者使用抽象类,从而脱离对具体业务的依赖。

不过在PetShop中,由于业务逻辑相对简单,这种思想体现得不够明显。

也正因为此,PetShop将核心的业务逻辑都放到了一个模块BBL中,并没有将具体的实现和抽象严格的按照模块分开。

9、缓存处理

PetShop4.0中在使用缓存时,是通过web.config配置进行设置,在使用时非常灵活。

下面从底向上具体分析.NetPetShop4.0缓存方面的技术。

  首先看一下该项目中与缓存直接相关的命名空间:

  PetShop.ICacheDependency

  PetShop.TableCacheDependency

  PetShop.CacheDependencyFactory

  PetShop.Web

  一、PetShop.ICacheDependency命名空间

  最低层应该是接口的定义了,在PetShop.ICacheDependency命名空间中只定义了一个接口IPetShopCacheDependency,该接口只有一个方法GetDependency,没有任何参数,返回AggregateCacheDependency类型。

AggregateCacheDependency是在.NETFramework2.0版中是新增的类,组合ASP.NET应用程序的Cache对象中存储的项和CacheDependency对象的数组之间的多个依赖项。

  二、PetShop.TableCacheDependency命名空间

  在PetShop.TableCacheDependency命名空间中,提供两种类:

抽象类TableDependency和它的继承类Category、Item和Product。

抽象类TableDependency的构造函数为:

protectedTableDependency(stringconfigKey)

{

stringdbName=ConfigurationManager.AppSettings["CacheDatabaseName"];

stringtableConfig=ConfigurationManager.AppSettings[configKey];

string[]tables=tableConfig.Split(configurationSeparator);

foreach(stringtableNameintables)

dependency.Add(newSqlCacheDependency(dbName,tableName));

}

  传递了一个参数configKey,根据该参数从web.config文件中获取表名列表,同时在web.config中获取数据库名称。

将表名列表中的所有数据表添加到AggregateCacheDependency类型的dependency变量中。

在此外使用了.NETFramework2.0版中是新增的另一个与缓存有关的SqlCacheDependency类。

这个类用于建立ASP.NET应用程序的Cache对象中存储的项和特定SQLServer数据库表之间的联系。

AggregateCacheDependency和SqlCacheDependency都从CacheDependency继承而来,但在.NET2.0中还未提供Oracle等其它数据库对应的类。

 

 下面是web.config文件中与缓存相关的设置:

  

--Enabledatacaching-->

--Cacheduration(inhours-wholenumberonly)-->

--Cachedependencyoptions.Possiblevalues:

PetShop.TableCacheDependencyforSQLServerandkeepemptyforORACLE-->

--CacheDatabaseNameshouldmatchthenameundercachingsection,whenusingTableCacheDependency-->

--*TableDependencyliststabledependencyforeachinstanceseparatedbycomma-->

每个继承类都只有一个构造函数,通过设置基类的configKey参数变成了三个不同的类。

Product类的构造函数为:

  publicProduct():

base("ProductTableDependency"){}

  三、PetShop.CacheDependencyFactory命名空间

  在PetShop.CacheDependencyFactory命名空间中有两个类,分别是DependencyAccess和DependencyFacade。

这两个类都是静态类,DependencyAccess类里面的方法都是返回IPetShopCacheDependency,而DependencyFacade里面的方法都是返回AggregateCacheDependency。

DependencyAccess类里面关键的一个方法是LoadInstance,它是工厂模式的具体实现。

其代码如下:

privatestaticIPetShopCacheDependencyLoadInstance(stringclassName){

stringpath=ConfigurationManager.AppSettings["CacheDependencyAssembly"];

stringfullyQualifiedClass=path+"."+className;

//Usingtheevidencegivenintheconfigfileloadtheappropriateassemblyandclass

return(IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);

}

  在这个方法中通过配置文件中的设置和传进来的参数className,返回相对应的程序集和类。

DependencyAccess类里面的其它三个方法,只是调用这个方法,传入不同的参数而已。

  DependencyFacade类提供的三个方法正好与DependencyAccess类的三个方法相对应,分别获取Category、Item和Product的AggregateCacheDependency。

在DependencyFacade类中还读取了web.config中的CacheDependencyAssembly设置,从而决定是调用DependencyAccess对应的方法,还是直接返回null。

  四、PetShop.Web命名空间

  在PetShop.Web的App_Code中,有四个静态类与缓存直接相关,分别是CategoryDataProxy、ItemDataProxy、ProductDataProxy和WebUtility。

其中前三个分别调用DependencyFacade对应的方法。

  WebUtility中有两个方法GetCategoryName和GetProductName使用了缓存,下面是GetCategoryName的部分代码:

if(data==null){

//CachingdurationfromWeb.config

intcacheDuration=int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);

//Ifthedataisnotinthecachethenfetchthedatafromthebusinesslogictier

data=category.GetCategory(categoryId).Name;

//CreateaAggregateCacheDependencyobjectfromthefactory

AggregateCacheDependencycd=DependencyFacade.GetCategoryDependency();

//Storetheoutputinthedatacache,andAddthenecessaryAggregateCacheDependencyobject

HttpRuntime.Cache.Add(cacheKey,data,cd,DateTime.Now.AddHours(cacheDuration),Cache.NoSlidingExpiration,CacheItemPriority.High,null);

}

  在.Net2.0中,对缓存的维护有两种方式:

第一种是每次使用缓存之间进行判断缓存是否存,如果不存在则读取数据存入缓存;另外一种方式是使用CacheItemRemovedCallback委托来实现,当缓存失效时自动调用委托过程,重新产生缓存。

从上面的代码来看,.NetPetShop4.0使用的是第一种方式。

10、相关设计模式

工厂模式:

首当其冲的就是工厂模式,很容易就可以看出来,也是应用最多的。

DALFactory:

数据访问层的抽象工厂(决定创建哪种数据库类型的数据访问层。

可以选择:

SQLServer,Oracle)

CacheDependencyFactory:

缓存依赖类的工厂类。

(创建具体表的缓存依赖)

MessagingFactory:

异时处理消息队列的抽象工厂(反射创建具体的异时处理类)

ProfileDALFactory:

ProfileDAL的工厂类(反射选择创建Oracle和SQLServer的ProfileDAL)

策略模式:

IorderStrategy

中介模式

CategoryDataProxyItemDataProxyProductDataProxy

11、MSMQ消息处理

      在PetS

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2