petshop & design

32
© 2004 Hewlett-Packard Development Company, L.P. The information contained herein is subject to change without notice PetShop & Design www.itwis.com

Upload: guido

Post on 24-Jan-2016

62 views

Category:

Documents


0 download

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

TRANSCRIPT

Page 1: PetShop & Design

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

PetShop & Design

www.itwis.com

Page 2: PetShop & Design

目录

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

Page 3: PetShop & Design

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

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

Page 4: PetShop & Design

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

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

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

Page 5: PetShop & Design

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

表示层

业务逻辑层

数据访问层

MS Sql DB Oracal DB

……

Page 6: PetShop & Design

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

Page 7: PetShop & Design

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

Page 8: PetShop & Design

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

Page 9: PetShop & Design

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

Page 10: PetShop & Design

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

IDAL

SQLServerDAL OracleDAL

Model

数据访问层的接口程序集

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

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

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

DALFactory

创建DAL 。 对象的工厂

Page 11: PetShop & Design

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

BBL

IBBLStrategy

DALFactory IDAL Model

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

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

Page 12: PetShop & Design

PetShop 架构设计• 表示层

Web Component

BBL

Page 13: PetShop & Design

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

Page 14: PetShop & Design

模式的应用• Factory 模式

IDAL

数据访问层的接口程序集

DALFactory

创建DAL 。 对象的工厂

Page 15: PetShop & Design

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

− ICategory− IInventory− IItem− IOrder− IProduct

Page 16: PetShop & Design

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() {}

• }

Page 17: PetShop & Design

Strategy 模式

BBL

IBBLStrategy

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

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

Page 18: PetShop & Design

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

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

Order

+Insert()

<<interface>>IOrderStrategy

+Insert()

OrderSynchronous

+Insert()

OrderAsynchronous

Page 19: PetShop & Design

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

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

Page 20: PetShop & Design

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

• protected AggregateCacheDependency dependency = new AggregateCacheDependency();

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

Page 21: PetShop & Design

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

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

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

Page 22: PetShop & Design

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));

Page 23: PetShop & Design

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

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

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

Page 24: PetShop & Design

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

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

• IOrderStrategy orderInsert = new

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

OrderSynchronous 对象所制约。

Page 25: PetShop & Design

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

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

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

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

Page 26: PetShop & Design

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

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

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

Page 27: PetShop & Design

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

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

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

value="PetShop.SQLServerDAL"/>

Page 28: PetShop & Design

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

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

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

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

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

Page 29: PetShop & Design

依赖注入

• 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);

• }

Page 30: PetShop & Design

依赖注入• 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"/>• 这样自然就解决了具体对象创建的问题,利用配置文件和

反射实现了依赖的注入。

Page 31: PetShop & Design

附:• 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 等特性。

Page 32: PetShop & Design

谢谢!