320 likes | 478 Views
PetShop & Design. www.itwis.com. 目录. PetShop 概述 系统架构设计 模式的应用 依赖注入. PetShop 概述. PetShop 起源与 .Net 技术与 J2EE 的“论战”。 PetShop 最新版本为 4.0 。采用了 .Net Framework 2.0 和 Asp.Net 。 是一个很好的学习 .Net 设计的实例。. PetShop 架构设计. “ 三层 ” 应用结构:数据访问层、业务逻辑层(领域层)、表示层 分层的设计: 结构清晰、耦合度低 便于系统的扩展 利于开发任务同步进行 降低了一定的性能.
E N D
PetShop & Design www.itwis.com
目录 • PetShop概述 • 系统架构设计 • 模式的应用 • 依赖注入
PetShop概述 • PetShop起源与.Net技术与J2EE的“论战”。 • PetShop最新版本为4.0。采用了.Net Framework 2.0和Asp.Net。 • 是一个很好的学习.Net设计的实例。
PetShop架构设计 • “三层”应用结构:数据访问层、业务逻辑层(领域层)、表示层 • 分层的设计: • 结构清晰、耦合度低 • 便于系统的扩展 • 利于开发任务同步进行 • 降低了一定的性能
PetShop架构设计 • 典型的分层结构 表示层 业务逻辑层 数据访问层 …… Oracal DB MS Sql DB
PetShop架构设计 • 基于.Net平台BS系统的常见层次结构
PetShop架构设计 • PetShop 2.0的应用架构
PetShop架构设计 • PetShop 3.0的应用架构
PetShop架构设计 • PetShop 4.0的应用架构
PetShop架构设计 • 数据访问层:DAL
PetShop架构设计 • 业务逻辑层:BLL
PetShop架构设计 • 表示层
模式的应用 • Factory模式 • Strategy模式 • Facade模式
模式的应用 • Factory模式
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模式 • 根据具体情况,PetShop在插入订单的时候,有两种方式:同步和异步。采用哪种方式,是由用户定制的,也就是说,插入订单的策略是随时发生变化的。
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模式 • 然而对于调用者而言,并不是要获得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等特性。