1 / 32

PetShop & Design

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

guido
Download Presentation

PetShop & Design

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PetShop & Design www.itwis.com

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

  3. PetShop概述 • PetShop起源与.Net技术与J2EE的“论战”。 • PetShop最新版本为4.0。采用了.Net Framework 2.0和Asp.Net。 • 是一个很好的学习.Net设计的实例。

  4. PetShop架构设计 • “三层”应用结构:数据访问层、业务逻辑层(领域层)、表示层 • 分层的设计: • 结构清晰、耦合度低 • 便于系统的扩展 • 利于开发任务同步进行 • 降低了一定的性能

  5. PetShop架构设计 • 典型的分层结构 表示层 业务逻辑层 数据访问层 …… Oracal DB MS Sql DB

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

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

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

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

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

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

  12. PetShop架构设计 • 表示层

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

  14. 模式的应用 • Factory模式

  15. Factory模式 • 在IDAL中,分别包含接口: • ICategory • IInventory • IItem • IOrder • IProduct

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

  17. Strategy模式

  18. Strategy模式 • 根据具体情况,PetShop在插入订单的时候,有两种方式:同步和异步。采用哪种方式,是由用户定制的,也就是说,插入订单的策略是随时发生变化的。

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

  20. Facade模式 • 在PetShop中,需要对数据表实现Cache。这些Cache都存放在.Net为Web系统提供的Cache集合对象System.Web.Caching.AggregateCacheDependency中。 • protected AggregateCacheDependency dependency = new AggregateCacheDependency(); • dependency.Add(new SqlCacheDependency(dbName, tableName);

  21. Facade模式 • 为了方便的创建各自数据表的CacheDependcy,PetShop提供了工厂类DependencyAccess: • public static class DependencyAccess • { • public static IPetShopCacheDependency • CreateCategoryDependency() {} • public static IPetShopCacheDependency • CreateProductDependency() {} • public static IPetShopCacheDependency • CreateItemDependency() {} • }

  22. Facade模式

  23. Facade模式 • 然而对于调用者而言,并不是要获得IPetShopCacheDependency对象,而是存放了正确的Table Name的SqlCacheDependency对象的集合AggregateCacheDependency。 • 当然,我们可以在创建了IPetShopCacheDependency对象后,调用GetDependency()方法来获得。为了方便调用者,就利用了Façade模式,建立了DependencyFacade类,在工厂类的基础上作了进一步的包装。(见代码)

  24. 依赖注入 • “抽象”的概念非常重要,但不管怎样抽象,最终还是需要具体的实现。例如前面介绍的插入订单的策略,我们提供了IOrderStrategy接口。然而对于BLL层来说,需要插入订单时,我们仍然要创建具体的OrderStrategy对象,也就是说下面的代码是不可避免的: • IOrderStrategy orderInsert = new OrderSynchronous(); • 这样一来,BBL中仍然为具体的OrderSynchronous对象所制约。

  25. 依赖注入 • 理想的情况是,具体对象的创建永远都不要在代码中实现。也就是说,模块与模块之间的依赖,由原来的内部依赖,转移到外部。 • 依赖是必须的,一旦转移到外部,就需要将该依赖注入到模块中,这就是所谓的“依赖注入(Dependency Injection)”。 • 关于“依赖注入”,Martin Fowler有很好的文章来介绍,可以访问:http://martinfowler.com/articles/injection.html

  26. 依赖注入 • 对于“依赖注入”,有一些轻量级容器已经实现。如Spring,PicoContainer等。在.Net平台下,也有Spring.Net等容器支持。 • 但究其根本,实际上还是通过反射来完成对依赖的注入,如果不使用这些轻量级容器来专门完成“依赖注入”的话,我们也可以引入反射和xml配置文件来解除模块对具体对象的依赖。 • 在PetShop中,这种方式随处可见。例如在DALFactory中的DataAccess类(参见代码)。

  27. 依赖注入 • 由于PetShop是一个Asp.Net的应用系统,所以配置信息都可以放在Web.Config文件下。然后,通过ConfigurationManager来获取,例如: • private static readonly string orderPath = ConfigurationManager.AppSettings["OrdersDAL"]; • 在Web.config的配置如下: • <add key="OrdersDAL" value="PetShop.SQLServerDAL"/>

  28. 依赖注入 • 如果我们的数据访问层,需要访问Oracle数据库,则只需要修改web.config中的配置: • <add key="OrdersDAL" value="PetShop.OracleDAL"/> • 而DALFactory中的代码根本不需要改变。 • 这个方法就可以解决前面提到的OrderStrategy的问题。在BBL的Order类中,需要调用IOrderStragety对象,以此来插入订单。方法是: • private static readonly PetShop.IBLLStrategy.IOrderStrategy orderInsertStrategy = LoadInsertStrategy();

  29. 依赖注入 • 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); • }

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

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

  32. 谢谢!

More Related