PetShop & Design

Preview:

DESCRIPTION

PetShop & Design. www.itwis.com. 目录. PetShop 概述 系统架构设计 模式的应用 依赖注入. PetShop 概述. PetShop 起源与 .Net 技术与 J2EE 的“论战”。 PetShop 最新版本为 4.0 。采用了 .Net Framework 2.0 和 Asp.Net 。 是一个很好的学习 .Net 设计的实例。. PetShop 架构设计. “ 三层 ” 应用结构:数据访问层、业务逻辑层(领域层)、表示层 分层的设计: 结构清晰、耦合度低 便于系统的扩展 利于开发任务同步进行 降低了一定的性能. - PowerPoint PPT Presentation

Citation preview

© 2004 Hewlett-Packard Development Company, L.P.The information contained herein is subject to change without notice

PetShop & Design

www.itwis.com

目录

• PetShop 概述• 系统架构设计• 模式的应用• 依赖注入

PetShop 概述• PetShop 起源与 .Net 技术与 J2EE 的“论战”。• PetShop 最新版本为 4.0 。采用了 .Net

Framework 2.0和 Asp.Net 。• 是一个很好的学习 .Net 设计的实例。

PetShop 架构设计• “三层”应用结构:数据访问层、业务逻辑层(领

域层)、表示层• 分层的设计:

− 结构清晰、耦合度低− 便于系统的扩展− 利于开发任务同步进行− 降低了一定的性能

PetShop 架构设计• 典型的分层结构• 典型的分层结构

表示层

业务逻辑层

数据访问层

MS Sql DB Oracal DB

……

PetShop 架构设计• 基于 .Net 平台 BS 系统的常见层次结构

PetShop 架构设计• PetShop 2.0 的应用架构

PetShop 架构设计• PetShop 3.0 的应用架构

PetShop 架构设计• PetShop 4.0 的应用架构

PetShop 架构设计• 数据访问层: DAL

IDAL

SQLServerDAL OracleDAL

Model

数据访问层的接口程序集

, 数据访问层需要使用的数据对象 也即为。 , 。 持久层的持久对象 只有属性 没有行为

MS Sql Server访问 数据。 。 I DAL 库 实现了 的接口

访问Oracle 。 数据库实现了IDAL 。 的接口

DALFactory

创建DAL 。 对象的工厂

PetShop 架构设计• 业务逻辑层: BLL

BBL

IBBLStrategy

DALFactory IDAL Model

业务逻辑层对业务。 策略的抽象封装

。 业务逻辑层 核心的业。 务代码都在本模块中

PetShop 架构设计• 表示层

Web Component

BBL

模式的应用• Factory 模式• Strategy 模式• Facade 模式

模式的应用• Factory 模式

IDAL

数据访问层的接口程序集

DALFactory

创建DAL 。 对象的工厂

Factory 模式•在 IDAL 中,分别包含接口:

− ICategory− IInventory− IItem− IOrder− IProduct

Factory 模式• 在 DALFactory 中, DataAccess 负责各个接口对象的创建:• public sealed class DataAccess• {

public static PetShop.IDAL.ICategory CreateCategory() {}

• public static PetShop.IDAL.IInventory CreateInventory() {}

• • public static PetShop.IDAL.IItem CreateItem() {}• • public static PetShop.IDAL.IOrder CreateOrder() {}

• public static PetShop.IDAL.IProduct CreateProduct() {}

• }

Strategy 模式

BBL

IBBLStrategy

业务逻辑层对业务。 策略的抽象封装

。 业务逻辑层 核心的业。 务代码都在本模块中

Strategy 模式• 根据具体情况, PetShop 在插入订单的时候,有两种

方式:同步和异步。采用哪种方式,是由用户定制的,也就是说,插入订单的策略是随时发生变化的。

Order

+Insert()

<<interface>>IOrderStrategy

+Insert()

OrderSynchronous

+Insert()

OrderAsynchronous

Facade 模式• Façade 的意思就是包装的外面,或者说是“门面”,也就是说我们可以对一些复杂的逻辑进行包装,使调用者更加方便快捷的调用。

• Façade 的表现如图所示:

Facade 模式•在 PetShop 中,需要对数据表实现 Cache 。这些 Cache 都存放在 .Net为Web 系统提供的Cache 集合对象System.Web.Caching.AggregateCacheDependency 中。

• protected AggregateCacheDependency dependency = new AggregateCacheDependency();

• dependency.Add(new SqlCacheDependency(dbName, tableName);

Facade 模式• 为了方便的创建各自数据表的 CacheDependcy,

PetShop 提供了工厂类 DependencyAccess :• public static class DependencyAccess • {• public static IPetShopCacheDependency • CreateCategoryDependency() {}• • public static IPetShopCacheDependency • CreateProductDependency() {}

• public static IPetShopCacheDependency • CreateItemDependency() {}• }

Facade 模式

+CreateCategoryDependcy() : IPetShopCacheDependency+CreateProductDependcy() : IPetShopCacheDependency+CreateItemDependcy() : IPetShopCacheDependency

DependencyAccess

+GetDependency()

<<interface>>IPetShopCacheDependency

AggregateCacheDependency

+GetDependency()

TableDependency

1

1

SqlCacheDependency

1

*

protected AggregateCacheDependency dependency = new AggregateCacheDependency();

dependency.Add(new SqlCacheDependency(dbName, tableName));

Facade 模式• 然而对于调用者而言,并不是要获得

IPetShopCacheDependency 对象,而是存放了正确的 Table Name的 SqlCacheDependency对象的集合 AggregateCacheDependency 。

• 当然,我们可以在创建了IPetShopCacheDependency 对象后,调用GetDependency() 方法来获得。为了方便调用者,就利用了 Façade 模式,建立了DependencyFacade 类,在工厂类的基础上作了进一步的包装。(见代码)

依赖注入• “ 抽象”的概念非常重要,但不管怎样抽象,最

终还是需要具体的实现。例如前面介绍的插入订单的策略,我们提供了 IOrderStrategy 接口。然而对于 BLL 层来说,需要插入订单时,我们仍然要创建具体的 OrderStrategy 对象,也就是说下面的代码是不可避免的:

• IOrderStrategy orderInsert = new

OrderSynchronous();• 这样一来, BBL 中仍然为具体的

OrderSynchronous 对象所制约。

依赖注入• 理想的情况是,具体对象的创建永远都不要在代码

中实现。也就是说,模块与模块之间的依赖,由原来的内部依赖,转移到外部。

• 依赖是必须的,一旦转移到外部,就需要将该依赖注入到模块中,这就是所谓的“依赖注入(Dependency Injection)” 。

• 关于“依赖注入”,Martin Fowler 有很好的文章来介绍,可以访问: http://martinfowler.com/articles/injection.html

依赖注入• 对于“依赖注入”,有一些轻量级容器已经实现。如 Spring, PicoContainer 等。在 .Net 平台下,也有 Spring.Net 等容器支持。

• 但究其根本,实际上还是通过反射来完成对依赖的注入,如果不使用这些轻量级容器来专门完成“依赖注入”的话,我们也可以引入反射和 xml配置文件来解除模块对具体对象的依赖。

•在 PetShop 中,这种方式随处可见。例如在DALFactory 中的 DataAccess 类(参见代码)。

依赖注入• 由于 PetShop 是一个 Asp.Net 的应用系统,所以配置信息都可以放在 Web.Config 文件下。然后,通过 ConfigurationManager 来获取,例如:

• private static readonly string orderPath = ConfigurationManager.AppSettings["OrdersDAL"];

•在Web.config 的配置如下:• <add key="OrdersDAL"

value="PetShop.SQLServerDAL"/>

依赖注入• 如果我们的数据访问层,需要访问 Oracle 数据库,则只需要修改web.config 中的配置:

• <add key="OrdersDAL" value="PetShop.OracleDAL"/>

•而 DALFactory 中的代码根本不需要改变。• 这个方法就可以解决前面提到的 OrderStrategy

的问题。在 BBL的 Order 类中,需要调用IOrderStragety 对象,以此来插入订单。方法是:

• private static readonly PetShop.IBLLStrategy.IOrderStrategy orderInsertStrategy = LoadInsertStrategy();

依赖注入

• private static PetShop.IBLLStrategy.IOrderStrategy LoadInsertStrategy()

• {• // Look up which strategy to use from config file• string path =

ConfigurationManager.AppSettings["OrderStrategyAssembly"];

• string className = ConfigurationManager.AppSettings["OrderStrategyClass"];

• return (PetShop.IBLLStrategy.IOrderStrategy)Assembly.Load(path).CreateInstance(className);

• }

依赖注入• IOrderStrategy 对象通过 LoadInsertStrategy() 方法来创建。它读取了配置节 OrderStrategyAssembly和 OrderStrategyClass ,然后利用反射创建该对象。

• 而在 web.config 中,配置如下:• <add key="OrderStrategyAssembly"

value="PetShop.BLL"/>• <add key="OrderStrategyClass"

value="PetShop.BLL.OrderSynchronous"/>• 如果需要修改插入订单的策略为异步,仅需要修改为:• <add key="OrderStrategyClass"

value="PetShop.BLL. OrderAsynchronous"/>• 这样自然就解决了具体对象创建的问题,利用配置文件和

反射实现了依赖的注入。

附:• PetShop 代码及相关文档链接:• http://msdn.microsoft.com/library/default.asp?url=

/library/en-us/dnbda/html/bdasamppet.asp• PetShop 4.0 download:

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

• PetShop 3.0 download:• http://msdn.microsoft.com/library/default.asp?url

=/library/en-us/dnbda/html/bdasamppet3.asp • PetShop 4.0 是在 .Net Framework 2.0 下开发的。之前的 3.0, 2.0 版本则可以在 .Net Framework 1.x 下运行。

• 如果是 .Net 1.x ,建议参考 PetShop 3.0• PetShop 4.0引入了许多 .Net 2.0 具有的特性,如泛

型、 Transacation、 Asp.Net 2.0 MemberShip 等特性。

谢谢!

Recommended