P etshop采用了典型的三层架构,从下而上为:数据访问层、业务逻辑层、表示层。
数据访问层 ,其主要功能就是负责数据库的访问,简单的说法就是完成对数据库的增删改查等基本操作。
安装后,有四个数据库,MSPetShop4,MSPetShop4Orders,MSPetShop4Profile,MSPetShop4Services。
1:MSPetShop4 :
Product:宠物商品目录
Category:宠物类别相关信息
Supplier:宠物供应商信息
Item:单个宠物详细信息
Inventory:宠物库存信息
2:MSPetShop4Orders
Orders:商品订单详细信息
LineItem:存储订单中所购买商品的信息
OrderStatus:记录订单的状态
3:MSPetShop4Profile
Account:记录客户的基本信息
Profile:客户活动的基本信息
Cart:客户购物车和意向清单中的信息
4:MSPetShop4Services
aspnet_Applications :存储数据库所涉及应用程序的有关信息
aspnet_Membership :存储与用户有关的信息
DBUtility
是数据访问的辅助,其中SqlHelper类图如下 :
CachedParameters()用于实现命令参数缓存的功能。
GetCachedParameters()方法用于获取缓存中的命令参数。
ExcuteReader()用于执行SqlCommand,并返回一个SqlDataReader对象。
ExecuteScalar()用于执行SQL文本或者存储过程,并返回结果集中第一行的第一列。
PrepareCommand()用于为执行SQL文本命令和存储过程,而设置SqlCommand相关参数。
在数据访问层中,使用IDAL抽象出数据访问逻辑,并以DALFactory作为数据访问层对象的工厂,IDAL支持SQL Server和Oracle,Model则是业务实体对象。其结构图如下:
业务逻辑层 ,是系统的核心部分,关系到整个系统的业务。通过调用数据访问层,来完成一系列的业务操作。
业务实体项目 Model :
业务实体和数据表中无必然的联系,业务实体是综合分析应用程序功能和数据库中的表后的结果。
站点的页面需要加载数据时,表示层向BLL项目发送请求,如:
private void BindCategories()
{
Category category = new Category ();
repCategories.DataSource = category.GetCategories();
repCategories.DataBind();
}
然后 category.GetCategories() 调用BLL项目中的 GetCategories() 方法,
public IList < CategoryInfo > GetCategories()
{
return dal.GetCategories();
}
而dal为一个 ICategory 接口类型的对象
private static readonly ICategory dal = PetShop.DALFactory. DataAccess .CreateCategory();
(面向接口编程)。
Category :
GetCategories() :获取所有宠物类别信息
GetCategory( string categoryId) :获取单个宠物类别
Item :
GetItem( string itemId) , GetItemsByProduct( string productId) :根据不同的参数获得单个宠物信息
Inventory :
CurrentQuantityInStock( string itemId) :获取宠物库存数量
TakeStock( LineItemInfo [] items) :更新库存量
Product :通过不同的参数获得宠物目录信息
GetProductsByCategory( string category) :
GetProductsBySearch( string text) :
GetProduct( string productId) :
Cart:
Add:向购物车或者意向清单中添加商品
Clear:清除购物车或者意向清单中商品
GetOrderLineItems:转换类型
Remove:根据参数删除商品
SetQuantity:更新购物车或者意向清单中的商品数量
表示层 , 系统的界面。
二:项目列表:
1:BLL 业务逻辑层
2:CacheDependencyFactory 缓存工厂类
3:Web 表示层
4:DALFactory 数据访问层的抽象工厂
5:DBUtility 数据访问的方法
6:IBLLStrategy 实现同步异步订单处理功能而定义的 接口 IOrderStrategy
7: ICacheDependency IPetShopCacheDependency 接口,实现简单工厂模式中的抽象接口
8:IDAL 定义了数据访问层的接口
9:IMessaging 定义了订单消息队列的接口
10:IProfileDAL 定义了Profile数据访问层接口
11:Membership 完成了成员资格管理的数据访问
12:MessagingFactory 处理消息队列的抽象工厂
13:Model 业务实体类
14:MSMQMesageing 实现了IOrder中定义的方法
15:OracleDAL Oracle数据访问层
16:OracleProfileDAL 数据库为Oracle时,抽象工厂中的具体产品类,实现了IProfileDAL定义的接口成员方法
17: OrderProcessor:处理来自消息队列的异步订单
18:Profile:Profile的数据访问层
19:ProfileDALFactory: ProfileDAL的工厂类
20: SQLProfileDAL: 数据库为SQL Server时,抽象工厂中的具体产品类,实现了IProfileDAL
定义的接口成员方法
21: SQLServerDAL: SQL Server的数据访问层
22: TableCacheDependency:缓存依赖的产品类
三:PetShop4中的设计模式
1:工厂模式:
DALFactory项目中的DataAccess为工厂类,IDAL项目作为抽象产品接口,而SQLServerDAL则是具体的产品类。
以下利用了反射技术,动态的加载指定类型。
public static PetShop.IDAL. ICategory CreateCategory()
{
string className = path + ".Category" ;
return (PetShop.IDAL. ICategory ) Assembly .Load(path).CreateInstance(className);
}
2:策略模式:
策略模式主要是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。
策略模式可以让算法在不影响客户端的情况下发生变化。
BLL项目中的Order类实现环境角色
IBLLStrategy项目中IOrderStrategry接口实现抽象策略角色。
BLL中的OrderSynchronous和OrderAsynchronous实现具体策略角色。