《解剖

PetShop

》系列之一

前言:

 

PetShop

是一个范例,微软用它来展示

.Net

企业系统开发的能力。业界有许多

.Net

J2EE

之争,许多数据是从微软的

PetShop

Sun

PetStore

而来。这种争论不可避

免带有浓厚的商业色彩,对于我们开发人员而言,没有必要过多关注。然而

PetShop

随着

版本的不断更新,至现在基于

.Net 2.0

PetShop4.0

为止,整个设计逐渐变得成熟而优

雅,却又很多可以借鉴之处。

PetShop

是一个小型的项目,系统架构与代码都比较简单,

却也凸现了许多颇有价值的设计与开发理念。

本系列试图对

PetShop

作一个全方位的解剖,

依据的代码是

PetShop4.0

,可以从链接

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

/bdasamppet4.asp

中获得。

一、

PetShop

的系统架构设计

在软件体系架构设计中,

分层式结构是最常见,

也是最重要的一种结构。

微软推荐的分层式

结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示

层,如图所示:

图一:三层的分层式结构

数据访问层:

有时候也称为是持久层,

其功能主要是负责数据库的访问。

简单的说法就是实

现对数据表的

Select

Insert

Update

Delete

的操作。如果要加入

ORM

的元素,那

么就会包括对象和数据表之间的

mapping

,以及对象实体的持久化。在

PetShop

的数据

 

访问层中,并没有使用

ORM

,从而导致了代码量的增加,可以看作是整个设计实现中的一

大败笔。

业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关。以

PetShop

为例,

业务逻辑层的相关设计,

均和网上宠物店特有的逻辑相关,例如查询宠物,

下订单,添加宠

物到购物车等等。如果涉及到数据库的访问,则调用数据访问层。

表示层:是系统的

UI

部分,负责使用者与整个系统的交互。在这一层中,理想的状态是不

应包括系统的业务逻辑。表示层中的逻辑代码,仅与界面元素有关。在

PetShop

中,是利

ASP.Net

来设计的,因此包含了许多

Web

控件和相关逻辑。

分层式结构究竟其优势何在?

Martin Fowler

在《

Patterns of Enterprise Application

Architecture

》一书中给出了答案:

1

、开发人员可以只关注整个结构中的其中某一层;

2

、可以很容易的用新的实现来替换原有层次的实现;

3

、可以降低层与层之间的依赖;

4

、有利于标准化;

5

、利于各层逻辑的复用。

概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。

一个好的分层式结构,可以使得开发人员的分工更加明确。一旦定义好各层次之间的接口,

负责不同逻辑设计的开发人员就可以分散关注,齐头并进。例如

UI

人员只需考虑用户界面

的体验与操作,

领域的设计人员可以仅关注业务逻辑的设计,

而数据库设计人员也不必为繁

琐的用户交互而头疼了。每个开发人员的任务得到了确认,开发进度就可以迅速的提高。

松散耦合的好处是显而易见的。

如果一个系统没有分层,

那么各自的逻辑都紧紧纠缠在一起,

彼此间相互依赖,谁都是不可替换的。一旦发生改变,则牵一发而动全身,

对项目的影响极

为严重。

降低层与层间的依赖性,

既可以良好地保证未来的可扩展,

在复用性上也是优势明

显。

每个功能模块一旦定义好统一的接口,

就可以被各个模块所调用,

而不用为相同的功能

进行重复地开发。

进行好的分层式结构设计,

标准也是必不可少的。

只有在一定程度的标准化基础上,

这个系

统才是可扩展的,可替换的。而层与层之间的通信也必然保证了接口的标准化。

金无足赤,人无完人

,分层式结构也不可避免具有一些缺陷:

1

、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访

数据库,以此获取相应的数据,如今却必须通过中间层来完成。

2

、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增

加一个功能,

为保证其设计符合分层式结构,

可能需要在相应的业务逻辑层和数据访问层中

都增加相应的代码。

前面提到,

PetShop

的表示层是用

ASP.Net

设计的,

也就是说,

它应是一个

BS

系统。

.Net

中,标准的

BS

分层式结构如下图所示:

 
 

 

图二:

.Net

中标准的

BS

分层式结构

随着

PetShop

版本的更新,其分层式结构也在不断的完善,例如

PetShop2.0

,就没有采

用标准的三层式结构,如图三:

图三:

PetShop 2.0

的体系架构

从图中我们可以看到,

并没有明显的数据访问层设计。

这样的设计虽然提高了数据访问的性

能,但也同时导致了业务逻辑层与数据访问的职责混乱。一旦要求支持的数据库发生变化,

或者需要修改数据访问的逻辑,

由于没有清晰的分层,

会导致项目作大的修改。

而随着硬件

系统性能的提高,

以及充分利用缓存、

异步处理等机制,

分层式结构所带来的性能影响几乎

可以忽略不计。

PetShop3.0

纠正了此前层次不明的问题,将数据访问逻辑作为单独的一层独立出来:

 
 

 

图四:

PetShop 3.0

的体系架构

PetShop4.0

基本上延续了

3.0

的结构,但在性能上作了一定的改进,引入了缓存和异步

处理机制,同时又充分利用了

ASP.Net 2.0

的新功能

MemberShip

,因此

PetShop4.0

的系统架构图如下所示:

图五:

PetShop 4.0

的体系架构

比较

3.0

4.0

的系统架构图,

其核心的内容并没有发生变化。

在数据访问层

DAL

中,

仍然采用

DAL Interface

抽象出数据访问逻辑,

并以

DAL Factory

作为数据访问层对象的

 

工厂模块。对于

DAL Interface

而言,分别有支持

 

MS-SQL

SQL Server DAL

和支持

Oracle

Oracle DAL

具体实现。

Model

模块则包含了数据实体对象。

其详细的模块结

构图如下所示:

图六:数据访问层的模块结构图

可以看到,在数据访问层中,完全采用了

面向接口编程

思想。抽象出来的

IDAL

模块,脱

离了与具体数据库的依赖,

从而使得整个数据访问层利于数据库迁移。

DALFactory

模块专

门管理

DAL

对象的创建,

便于业务逻辑层访问。

SQLServerDAL

OracleDAL

模块均实

IDAL

模块的接口,

其中包含的逻辑就是对数据库的

Select

Insert

Update

Delete

操作。因为数据库类型的不同,对数据库的操作也有所不同,代码也会因此有所区别。

此外,抽象出来的

IDAL

模块,除了解除了向下的依赖之外,对于其上的业务逻辑层,同样

仅存在弱依赖关系,如下图所示:

 
 

三层PetShop架构设计的更多相关文章

  1. PetShop的系统架构设计

    <解剖PetShop>系列 一.PetShop的系统架构设计 http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html ...

  2. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  3. ENode框架Conference案例分析系列之 - 架构设计

    Conference架构概述 先贴一下Conference案例的在线地址,UI因为完全拿了微软的实现,所以都是英文的,以后我有空再改为中文的. Conference后台会议管理:http://www. ...

  4. 基于 Angularjs&Node.js 云编辑器架构设计及开发实践

    基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...

  5. [转]Android App整体架构设计的思考

    1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...

  6. .NET架构设计、框架设计系列文章总结

    从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以 ...

  7. .NET应用架构设计—用户端的防腐层作用及设计

    阅读目录: 1.背景介绍 2.SOA架构下的显示端架构腐化 3.有效使用防腐层来隔离碎片服务导致显示端逻辑腐烂 4.剥离服务调用的技术组件让其依赖接口 5.将服务的DTO与显示端的ViewModel之 ...

  8. .NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)

    阅读目录: 1.背景介绍 2.简要回顾下传统三层架构 3.企业级应用分层架构(现代分层架构的基本演变过程) 3.1.服务层中应用契约式设计来解决动态条件不匹配错误(通过契约式设计模式来将问题在线下暴露 ...

  9. GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

    在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...

随机推荐

  1. Nginx--Sorry, the page you are looking for is currently unavailable

  2. Cobbler 批量安装操作系统

    文章目录 环境准备 部署cobbler cobbler语法检查以及排错 问题1 问题2 问题3 问题4 问题5 问题6 问题7 问题8 修改dhcp模板 重启服务,再次检查 镜像配置 镜像导入 kic ...

  3. simulink模块执行顺序

    1.simulink各模块执行顺序 Simulink模块的执行顺序都是序贯进行的,也就是沿着信号的流向进行.没有输入的模块先进行计算,更新状态量与输出,需要输入信号的模块等到输入信号准备ready之后 ...

  4. kube-scheduler源码分析(1)-初始化与启动分析

    kube-scheduler源码分析(1)-初始化与启动分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作 ...

  5. 深入MySQL(三):MySQL的索引的应用

    在MySQL的优化中,索引的作用绝对算是一个大头,很多时候索引使用得当可以使得一个查询的效率提高几个数量级,同时它还具有自动排序等功能.所以如果是深入MySQL,那么索引绝对是其中重要的一部分. My ...

  6. Redis 源码简洁剖析 16 - 客户端

    整体概述 客户端属性 套接字描述符 标志 输入缓冲区 命名及命令参数 命令的实现函数 输出缓冲区 客户端的创建与关闭 创建普通客户端 关闭普通客户端 参考链接 Redis 源码简洁剖析系列 整体概述 ...

  7. Session、Session共享、Token演变

    巨人的肩膀 深夜,我偷听到程序员要对session下手-- (qq.com)

  8. Android SugarORM(2)

    Android Sugar ORM (2) Android Sugar ORM 实体 1. 创建一个实体类 Sugar ORM在创建一个实体的时候, 仅需要使这个实体类继承于SugarRecord即可 ...

  9. curl的HTTP参数速查表

    curl简介 curl是一个开源的命令行工具,它基于网络协议,对指定URL进行网络传输,得到数据后不任何具体处理(如:html的渲染等),直接显示在"标准输出"(stdout)上. ...

  10. 更快的网络文件系統 — Oxfs

    什麽时候需要网络文件系统 ? 做嵌入式的同学经常会使用 NFS 将 host 上的某个目录挂载到开发板上,方便 host 上编译构建后能直接在板子上运行,减少手工拷贝操作.网站开发时,在 host 上 ...