- 浏览: 111753 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (134)
- java (134)
- [转]sqlserver 数据类型 及使用考虑 (1)
- 保存、读取、删除到sdcard图片 (1)
- hashcode 重写 (1)
- sql2008导出数据 (1)
- Android开发(1):随机绘制彩色实心圆 (1)
- JPA 应用技巧 1:实体类和实体 DAO 模板 (1)
- 狩魂之神即将开测 - 2012年最值得期待的网页游戏 (1)
- mantis (1)
- MediaWiki (1)
- ExtMail (1)
- MDaemon搭建公司项目环境 (1)
- NIO 之 选择就绪模式 (1)
- web应用系统架构设计 (1)
- XML CDATA (1)
- firefox+Firebug调试JavaScript、HTML和CSS (1)
- 在SUSE 11中安装Windows虚拟机 (1)
- 将字节流(byte[])转换成文件 (1)
- HTML5网站 (1)
- 在Android中自定义IOS风格的按钮 (1)
- 基于SVG的WebGIS的一个雏形 (1)
- 程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题 (1)
- 介绍一个ASP.NET开发工具Web Matrix (1)
- C#信息采集工具实现 (1)
- Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布 (1)
- 2011面试题目之猴子偷桃 (1)
- Linux tar压缩时排除某个目录或文件的参数 (1)
- Crack JRebel 4.0,无需重启JVM,热部署解决方案 (1)
- Groovy Sql使用Spring的事务管理 (1)
- <<让oracle跑的更快1>>读书笔记2 (1)
- 不要再浪费时间 (1)
- JSP (1)
- PHP (1)
- Python (1)
- Ruby (1)
- Perl概要及各自特点 (1)
- JVM 内存结构(转) (1)
- [转载]JPA 批注参考(1) (1)
- Hadoop配置部分内容 (1)
- HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合 (1)
最新评论
-
alexyao8:
顶起
[G4Studio开源平台]如何搭建G4开发环境 -
greatghoul:
太二了。
不要再浪费时间 -
wengbo316:
它们一定是花果山的猴子,数数能数到3K多呢。。。
2011面试题目之猴子偷桃 -
mycar:
额.待补充...........
保存、读取、删除到sdcard图片 -
沙舟狼客:
这太折磨人了, 还有人要看吗?
[] javaeye rss抓取
<h2><span>应用系统架构设计-补全篇</span></h2>
<p dir="ltr" style="margin-right: 0px;"><span><span lang="EN-US"><span> </span></span>我们在做着表面上看似是对于各种不同应用的开发,其实背后所对应的架构设计都是相对稳定的。在一个好的架构下编程,不仅对于开发人员是一件赏心悦目的事情,更重要的是软件能够表现出一个健康的姿态;而架构设计的不合理,不仅让开发人员受苦受难,软件本身的生命周期更是受到严重威胁。这里我将针对在微软</span><span lang="EN-US">dotNet</span><span>平台上做应用开发的系统架构设计做一个粗浅的讨论。</span>
<span lang="EN-US"> </span>
<p align="center"><span lang="EN-US"> <img align="baseline" src="http://www.cnblogs.com/images/cnblogs_com/simonw/%E5%BA%94%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1-%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84%E5%9B%BE.jpg" alt="" hspace="5" width="251" height="432"></span>
<span lang="EN-US"> </span>
<h2><span>表示层</span></h2>
<span>表示层由</span><span lang="EN-US">UI</span><span>(</span><span lang="EN-US">User Interface</span><span>)和</span><span lang="EN-US">UI</span><span>控制逻辑组成。</span>
- <span lang="EN-US"><span lang="EN-US">UI</span><span>(</span><span lang="EN-US">User Interface</span><span>)</span> </span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>UI</span><span>是客户端的用户界面,负责从用户方接收命令,请求,数据,传递给业务层处理,然后将结果呈现出来。根据客户端的不同我们大体将应用程序分为</span><span lang="EN-US">BS</span><span>(</span><span lang="EN-US">Browser-Server</span><span>)</span> <span>浏览器结构,</span><span lang="EN-US">CS</span><span>(</span><span lang="EN-US">Client-Server</span><span>)桌面客户端结构。</span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>BS</span><span>的优点是无需操心客户端,只需要部署维护好服务器即可。</span><span lang="EN-US">CS</span><span>的优点在于强大的界面交互表达能力。</span><span lang="EN-US">RIA</span><span>(</span><span lang="EN-US">Rich Internet Application</span><span>)是为了融合这两种结构优点的一种技术,它依赖在客户端一次性安装一个通用解释器之后即获得强大的界面交互表达能力和无需部署具体客户端的方便性。具体的实现技术很多,例如微软的</span><span lang="EN-US">SmartClient</span><span>,</span><span lang="EN-US"> Avalon</span><span>;</span><span lang="EN-US"> Macromedia</span><span>的</span><span lang="EN-US">Flex</span><span>;以</span><span lang="EN-US">JS</span><span>为基础的</span><span lang="EN-US">Bindows</span><span>;</span><span lang="EN-US">Ajax</span><span>等等很多。</span><span lang="EN-US"> </span>
- <span lang="EN-US"><span lang="EN-US">UI</span><span>控制逻辑</span> </span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>UI</span><span>控制逻辑负责处理</span><span lang="EN-US">UI</span><span>和业务层之间的数据交互,</span><span lang="EN-US">UI</span><span>之间状态流程的控制,同时负责简单的数据验证和格式化等功能。具体的说在</span><span lang="EN-US">dotNet</span><span>事件驱动的编程模型下,</span><span lang="EN-US">UI</span><span>控制逻辑被自然的实现在了事件函数中,例如</span><span lang="EN-US">PageLoad</span><span>事件函数,</span><span lang="EN-US">ButtonClick</span><span>事件函数。在这些事件函数中,主要任务就是做</span><span lang="EN-US">UI</span><span>控件与业务实体的数据交换与业务调用,但面对大量的数据交换工作量与维护量就成了最大的问题。而在复杂应用的系统中,状态与流程的管理是必须要考虑的因素,它包含了界面与业务两方面。如果不加以封装的直接写在事件函数中将导致业务依赖表示层。下面分别讨论这两个问题。</span><span lang="EN-US"> </span>
<blockquote dir="ltr" style="margin-right: 0px;">
<span lang="EN-US"><span lang="EN-US">1.UI</span><span>与业务实体之间的数据交互</span></span>
</blockquote>
<span><span lang="EN-US"><span> </span></span>此阶段负责数据交换的业务实体我把它称为</span><span lang="EN-US">DTO</span><span>(</span><span lang="EN-US">Data Transfer Object</span><span>),但需要说明的是这里的</span><span lang="EN-US">DTO</span><span>并不是只包含数据的业务对象,它仍然包含必要的方法是完整的业务实体。处理输入时我们从</span><span lang="EN-US">UI</span><span>控件的获得数据填入</span><span lang="EN-US">DTO</span><span>再向下传播,处理输出时用户发出请求业务层会将数据以</span><span lang="EN-US">DTO</span><span>的形式返出再赋给</span><span lang="EN-US">UI</span><span>控件展现。因此需要一种方式来自动解决这样的来回赋值问题。</span><span lang="EN-US">Java</span><span>下</span><span lang="EN-US">Structs</span><span>的</span><span lang="EN-US">Formbean</span><span>对此问题提供了一定支持,而遗憾的是</span><span lang="EN-US">dotNet</span><span>下的不少控件虽然支持数据绑定但仍然没有一个现成完整的解决办法。一种比较简单的方式是自己设计一个</span><span lang="EN-US">Adapter</span><span>按照某种映射关系来自动处理这样的绑定,这样的映射关系最好是</span><span lang="EN-US">UI</span><span>控件与</span><span lang="EN-US">DTO</span><span>属性的事先命名约定,以此种方式的约定作为映射关系无需增加任何配置文件和配置工作即可实现。例如你的一个输入人名的</span><span lang="EN-US">Textbox</span><span>命名为</span><span lang="EN-US">txtUserName</span><span>,而我的业务实体属性命名为</span><span lang="EN-US">UserName</span><span>,这样就可以通过字符串的查找来找到对应。</span><span lang="EN-US"> </span>
<blockquote dir="ltr" style="margin-right: 0px;">
<span lang="EN-US"><span>2.状态与流程的管理</span></span>
</blockquote>
<span><span lang="EN-US"><span> </span></span>复杂业务方面的状态与流程可以通过一些工作流引擎来解决,微软最近独立发布了自己的工作流引擎有兴趣的朋友可以去看看。一般更多的情况是需要解决界面上状态与流程的管理。耦合再表示层中是不可取的办法。</span><span lang="EN-US">MVC</span><span>(</span><span lang="EN-US"><span style="color: #108ac6;">Model-View-Controller</span></span><span>)模式提供了实现这一目标的方法。</span><span lang="EN-US">Controller</span><span>是整个方案的核心,它是一个流程管理器,来自</span><span lang="EN-US">UI</span><span>所有的命令与数据经过</span><span lang="EN-US">Controller</span><span>分发给业务层或其他</span><span lang="EN-US">UI</span><span>,这样我们可以把流程,权限等逻辑单独封装,例如配置文件中,达到最大化的业务重用。</span><span lang="EN-US">dotNet</span><span>下</span><span lang="EN-US">MVC</span><span>的方案并不像</span><span lang="EN-US">Java</span><span>下有那么多选择,目前有以下几种选择:</span>
<span>微软的</span><span lang="EN-US"><span style="color: #108ac6;">UIPAB</span></span><span>,它可以处理</span><span lang="EN-US">bs</span><span>,</span><span lang="EN-US">cs</span><span>下的流程跳转,可以使得相同的业务系统有</span><span lang="EN-US">webform</span><span>和</span><span lang="EN-US">winform</span><span>不同的展现方式。</span>
<span>开源的</span><span lang="EN-US"><span style="color: #108ac6;">Mavrick.Net</span></span><span>,它只适用于</span><span lang="EN-US">Asp.Net</span><span>应用程序,它对流程,国际化,页面包装,</span><span lang="EN-US">xslt</span><span>页面转换提供了很好的支持。</span>
<span>开源的</span><span lang="EN-US"><span style="color: #108ac6;">Lattis</span></span><span>,功能比较单一,同样只适用于</span><span lang="EN-US">Asp.Net</span><span>应用程序。</span>
<span lang="EN-US"> </span>
<h2><span>业务层</span></h2>
<span><span lang="EN-US"><span> </span></span>业务层封装了实际业务逻辑,包含数据验证,事物处理,权限处理等业务相关操作,是整个应用系统的核心。因此设计一个能够真实反映实际需要的业务层是非常必要的,我们将实际业务具体分为业务数据与业务操作两部分。</span><span lang="EN-US"> </span>
- <span lang="EN-US"><span>业务数据</span> </span>
<span><span lang="EN-US"><span> </span></span>业务数据又是业务逻辑的核心,最终业务数据将以一种固定的格式表现于内存中,在系统的各个层次间传输,充当</span><span lang="EN-US">DTO</span><span>角色。表达业务数据的方式一般分为两种</span><span lang="EN-US">Table Model</span><span>和</span><span lang="EN-US">Domain Model</span><span>。</span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>Table Model</span><span>是将数据库中的表直接映射成为业务数据对象,这样的优点是适合于机器操作,</span><span lang="EN-US">ADO.NET</span><span>直接提供了这种操作的便利,但对于复杂业务关系的表达就很不直观。只适合于业务需求与数据表对应关系很直接的需要快速开发的情况。通常我们选用</span><span lang="EN-US">Dataset</span><span>或者强类型</span><span lang="EN-US">Dataset</span><span>(</span><span lang="EN-US">Strong Typed Dataset</span><span>),强类型</span><span lang="EN-US">Dataset</span><span>支持编译时的类型检查,效率上要略高于普通</span><span lang="EN-US">Dataset</span><span>。</span><span lang="EN-US">Dataset</span><span>有很多方便的特性:无需自己编写维护类,支持序列化,数据副本保存,支持数据集合,对控件绑定支持效果好,微软提供了相应的生成工具以及持久方案。但缺点也是明显,复杂数据表现不直观,做为</span><span lang="EN-US">DTO</span><span>在各个层次间传输,尤其是分布式环境,庞大的体积,相对缓慢的实例化对于性能造成很大压力。</span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>Domain Model</span><span>则是根据实际业务按照现实方式用</span><span lang="EN-US">OO</span><span>思想建模,这样很适合业务复杂的系统。通常采用自定义数据实体(</span><span lang="EN-US">Custom Data Entity</span><span>)方式表达。自定义数据实体,有着良好的性能,编译时的类型检查,数据表现方式非常直观符合实际业务的操作方式等优点,但需要自己定义维护类,在分布式环境下需要自己编写序列化方法。</span>
<span><span lang="EN-US"><span> </span></span>综合各种因素考虑,虽然业务简单对应直接的系统我们以</span><span lang="EN-US">Table Model</span><span>建模开发效率很高但难免保证系统日后不会变的复杂,因此出于复用性,扩展性,性能等方面选用</span><span lang="EN-US">Domain Model</span><span>建模为佳。</span><span lang="EN-US"> </span>
- <span lang="EN-US"><span>业务操作</span> </span>
<span><span lang="EN-US"><span> </span></span>业务操作负责对业务数据进行各种业务相关的处理,例如验证,流向,整合,事物,权限等,但它不负责有关对数据源的操作。它与业务数据的关系设计有</span><span lang="EN-US">2</span><span>种方式。</span>
<span><span lang="EN-US"><span> </span></span>分离业务数据与业务操作,将业务数据单独封装到只有数据</span><span lang="EN-US">get</span><span>,</span><span lang="EN-US">set</span><span>的数据类中,这个数据类只充当</span><span lang="EN-US">DTO</span><span>。将业务操作封装到独立的</span><span lang="EN-US">service</span><span>类中与业务数据一起充当业务层。这样当系统不复杂的时候显的简单直观,而随着系统日益复杂,</span><span lang="EN-US">service</span><span>类会变的杂乱,而将本身耦合紧密的数据与操作分离对于复用也是不利的因素。具体可参考</span><span lang="EN-US">Martin Fowler </span><span>的</span><span lang="EN-US"><span style="color: #108ac6;"><span><span lang="EN-US"><span lang="EN-US">贫血的</span>Domain Model</span></span><span>一文。</span></span></span>
<span><span lang="EN-US"><span> </span></span>整合业务数据与业务操作,将业务数据与相关的业务操作封装在一起称为业务实体,业务实体作为统一的业务层为表示层提供服务,同时也负责作为</span><span lang="EN-US">DTO</span><span>在各个层次间传输,我倾向于这样完整的</span><span lang="EN-US">Domain Model</span><span>设计方式,每个业务实体都可以做为一个单独组件形式存在,对于组件化复用有着莫大的好处。</span>
<span lang="EN-US"> </span>
<h2><span>业务数据访问层</span></h2>
<span><span lang="EN-US"><span> </span></span>业务数据访问层是一个针对具体应用系统的专属层,它为业务层提供与数据源交互的最小操作方式,仅仅是业务层需要的数据访问接口,业务层完全依赖业务数据访问层所提供的服务。这些服务负责从业务层接收数据或返回业务实体,它屏蔽了实际业务数据与机器存储方式的差别。当然,数据层选用抽象的解决方案同样可以达到这个效果,但业务数据访问层最大的特点就是针对具体业务做抽象,而抽象的数据层访问方案是针对通用做抽象。往往业务中针对具体的设计生命力会变的更强,这样我们可以最大限度的保持了上层代码的复用性,当需要更换存储策略如果数据层访问差别太大,通过更换数据层无法解决问题的时候我们最多只需要更换业务数据访问层,而无需改变业务层。</span><span lang="EN-US"> </span>
<span><span lang="EN-US"><span> </span></span>业务数据访问层由</span><span lang="EN-US">DAO</span><span>(</span><span lang="EN-US">Data Access Object</span><span>)层和系统服务层两部分组成。</span><span lang="EN-US">DAO</span><span>层为每个业务实体提供最基本的数据访问服务,系统服务层为系统全局提供与业务关系不大的通用数据访问服务,这两层处于系统中的同一个层次位置。</span>
<span lang="EN-US"> </span>
<p align="center"><span>业务层与业务数据访问层关系图</span>
<p align="center">?
<h2><span>数据层</span></h2>
<span><span lang="EN-US"><span> </span></span>数据层的宗旨就是为数据源提供一个可供外界访问的接口,我们应该选用一种能够提供数据源无关的抽象数据访问接口并通过在其下挂接各种不同的</span><span lang="EN-US">DataProviador</span><span>来访问数据源的数据层组件,这样做便于移植到不同的数据源上。目前有以下</span><span lang="EN-US">3</span><span>种数据层方案:</span><span lang="EN-US"> </span>
<span lang="EN-US"><span>1.<span> </span></span><span>封装</span><span lang="EN-US">ADO.Net</span></span>
<span><span lang="EN-US"><span> </span></span>这些数据访问组件都是基于</span><span lang="EN-US">ADO.Net</span><span>的浅封装,它的优点在于封装层次低所以速度最快,我们可以手动组织</span><span lang="EN-US">sql</span><span>语句用来适应复杂的操作以及个性的优化等。缺点是无法直接处理自定义数据实体方式的业务实体对象,需要将业务实体中的数据属性以参数形式传入传出。这样的方式虽然最为保险,但随着系统规模增大,开发效率,质量,,后期的维护,二次开发都变成尤为突出的问题,对开发人员的要求会变的越来越高。另外对于事物操作封装不是很好,无法提供声明性事物,经常会在业务层出现访问数据层的需要。这样的组件目前应用的很广泛,例如微软在</span><span lang="EN-US"><span style="text-decoration: underline;"><span><span style="color: #108ac6;">EnterpriseLibrary</span></span></span></span><span>中提供的</span><span lang="EN-US">DAAB</span><span>(</span><span lang="EN-US">Data Access Application Block</span><span>),还有以前的</span><span lang="EN-US">DAAB3.1</span><span>。</span><span lang="EN-US">EnterpriseLibrary</span><span>是个成熟的产品,包括了数据访问,异常,日志,缓存,加密,配置</span><span lang="EN-US">,</span><span>安全等组件做为通用服务非常适合。</span><span lang="EN-US"> </span>
<span lang="EN-US"><span>2.<span> </span></span><span lang="EN-US">OR-Mapping</span><span>组件</span></span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>ORM</span><span>是最好的数据持久解决方案,它的优点在于能够以面向对象的方式操纵数据,因此可以直接处理自定义数据实体的业务对象,我们根本不用操心</span><span lang="EN-US">sql</span><span>语句以及底层存储方式,这样极大的简化的代码提高了开发效率,对于日后维护扩展都带来极大的便利。缺点在于屏蔽了底层使得我们无法针对具体数据源做优化,而且对于复杂关联的</span><span lang="EN-US">sql</span><span>操作有些力不从心,同时性能也差一些但辅助以缓存情况会好很多,而在</span><span lang="EN-US">dotNet</span><span>下最大的问题就是没有一个成熟便宜的</span><span lang="EN-US">ORM</span><span>产品供我们使用,全部都是</span><span lang="EN-US">beta</span><span>版本和商业版本。这些版本或多或少都存在一些问题,以至于真正应用中需要经过仔细考察。例如</span><span lang="EN-US">NHibernate</span><span>,</span><span lang="EN-US">Gentle.Net</span><span>,</span><span lang="EN-US">XPO</span><span>,</span><span lang="EN-US">Grove.Net</span><span>等等非常多。</span><span lang="EN-US"> </span>
<span lang="EN-US"><span>3.<span> </span></span><span lang="EN-US">DataMapper</span><span>(</span><span lang="EN-US">SqlMapper</span><span>)</span></span>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>SqlMapper</span><span>为以上两种方式提供了一个折中的选择,它可以以面向对象的方式直接处理自定义数据实体的业务对象,同时可以根据与数据源与业务实体的映射关系执行手写的</span><span lang="EN-US">sql</span><span>语句,这样完全使得我们可以针对具体数据源做优化,对于复杂操作同样可以胜任。目前只有</span><span lang="EN-US"><span style="color: #108ac6;">iBatis.Net</span></span><span>一个产品,它是一个</span><span lang="EN-US">java</span><span>移至的开源项目,已经比较成熟,可以在无需编译的情况下随意替换</span><span lang="EN-US">DAO</span><span>。</span>
<span lang="EN-US"> </span>
<h2><span>各层间的依赖关系</span></h2>
<p align="center"><span>依赖关系图:</span>
<p align="center"><span lang="EN-US"><img align="center" src="http://www.cnblogs.com/images/cnblogs_com/simonw/%E5%BA%94%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1-%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB.jpg" alt="" width="377" height="444"></span>
<span lang="EN-US"><span> </span><span>在对各层的讨论之后,我们来总结一下各层间的依赖关系。说到依赖就离不开复用这个词,复用对软件开发流程的几乎每个阶段都有着重要的意义。在设计阶段它代表着更清晰的设计,在开发阶段它代表着更高的工作效率和代码质量,在测试阶段它代表着更轻易的捕获</span><span lang="EN-US">bug</span><span>,在维护和再开发阶段它代表着更小的工作量。更好的复用需要设计更好的依赖关系。</span><span lang="EN-US"> </span></span>
<span><span lang="EN-US"><span> </span></span>从图中可以看出表示层与业务数据访问层都依赖于业务层,而业务层是相对独立的,这样设计的优点就是最大限度的减少了变动对整个系统所带来的影响。最坏的情况就是业务的改变,业务改变其他依赖业务层的地方必须改变(在这里我们忽略了一些针对多种业务而设计的其他层组件,这些组件是可以适应有限的业务变更而本身不用变更的。),这个我们没有办法控制。但像表示层与业务数据访问层等其他非业务方面的改动不会影响到其他地方。</span><span lang="EN-US"> </span>
<span><span lang="EN-US"><span> </span></span>有人应该注意到了图中的配置文件。在没有它的时候,业务层是依赖于业务数据访问层的,细心的读者应该能从业务层与业务数据访问层关系图中发现这个问题。这样双向依赖的关系是以后造成无法复用的根本所在。因此需要抽象出业务数据访问接口,让业务层去依赖这个接口,而不是业务数据访问层。但光声明接口是不够的,因为在实例化的时候仍然需要具体的下层类,所以依旧无法摆脱依赖关系。于是把依赖转移出来,这又引出了依赖倒置(</span><span lang="EN-US">Dependency Inversion Principle</span><span>)的概念,具体可以参见</span><span lang="EN-US">Martin Fowler</span><span>的相关论述。</span><span lang="EN-US">IoC</span><span>(</span><span lang="EN-US">Inversion of Control</span><span>)容器为我们提供了完美的方案,通过它将不同的模块注入到系统中我们可以在不知道这个组件存在的情况下调用它。这样的方式同样适合于权限管理,邮件发送等等其他组件。</span><span lang="EN-US"><span style="color: #108ac6;">Spring.Net</span></span><span>和</span><span lang="EN-US"><span style="color: #108ac6;">Castle</span></span><span>是</span><span lang="EN-US">dotNet</span><span>下的两个优秀的</span><span lang="EN-US">IoC</span><span>容器</span><span lang="EN-US">Spring.Net</span><span>是</span><span lang="EN-US">Java</span><span>下</span><span lang="EN-US">Spring</span><span>的移植版本,</span><span lang="EN-US">Castle</span><span>相对更要成熟。但是当你使用的组件并不是很多而不愿使用配置这些复杂而强大的产品时,你就要手工完成这些工作,你需要把业务层使用那些数据访问组件写在配置文件中,然后通过工厂(</span><span lang="EN-US">Factory</span><span>)解析配置文件应用反射(</span><span lang="EN-US">Reflection</span><span>)技术实例化出你的组件。</span><span lang="EN-US"> </span>
<span><span lang="EN-US"><span> </span></span>最后再说点关于</span><span lang="EN-US">AOP</span><span>(</span><span lang="EN-US">Aspect-OrientedProgramming</span><span>)的话题,在一些非常通用的组件或者系统功能间我们可以使用</span><span lang="EN-US">AOP</span><span>技术来打散系统其他部分对他们的依赖。像权限管理,系统日志,异常处理等。拿权限管理来举例,通常我们是在需要做权限检测的函数内部的开头来加一行权限检测代码,通过则执行后续代码否则跳出。这样写破坏了业务的纯洁性,业务的存在于权限并没有什么关系,而且使业务代码依赖权限组件,当我需要去除权限而另做新系统的时候这是见很麻烦的事情。</span><span lang="EN-US">AOP</span><span>的好处在于可以以声明方式来处理这些问题,例如你只需在需要验证的函数前加上一行属性的描述或者在配置文件中写上那些函数需要验证,执行时</span><span lang="EN-US">AOP</span><span>组件会按照你预先定制的先后顺序执行你的代码,这样我们可以轻松的剥离这些组件而丝毫不会对现有系统造成任何影响。</span>
<span lang="EN-US"> </span>
<h2>
<span>关于</span><span lang="EN-US">Service</span><span>层的讨论</span>
</h2>
<span lang="EN-US"><span lang="EN-US"><span> </span></span>Service</span><span>层是一个构建于表示层于业务层之间的层,它是对业务层的一个浅封装而不应该封装过多的业务逻辑,否则会造成不必要的麻烦。然而它并不是任何时候都有必要存在。一种情况下当你的</span><span lang="EN-US">UI</span><span>所要展现的东西和你的业务实体并不是那么完全吻合的时候,例如你的界面需要显示若干个业务实体的一部分,但这并不是业务本身,只是一种展现方式。这时候你需要</span><span lang="EN-US">Service</span><span>层来做一个展现逻辑的转换。或者当你在做分布式系统的时候可以利用</span><span lang="EN-US">Service</span><span>层来实现一个粗粒度的服务接口。也可以以</span><span lang="EN-US">SOA</span><span>(</span><span lang="EN-US">Service-oriented Architecture</span><span>)的方式来理解</span><span lang="EN-US">Service</span><span>层,我们最终使用的是系统所提供的服务而不是业务对象,所以需要将将业务对象以清晰的方式组织起来形成清晰的服务暴露在外。更多的情况在于你结合实际该如何使用。</span>
<span lang="EN-US"> </span>
<h2><span>结束语</span></h2>
<span><span lang="EN-US"><span> </span></span>至此,整个架构方案的讨论已经完成,我们可以看出</span><span lang="EN-US">dotNet</span><span>下可供选择的解决方案是那么的有限,反看</span><span lang="EN-US">Java</span><span>世界,有那么多成熟可供利用的组件框架,甚是着急。不过</span><span lang="EN-US">dotNet</span><span>也正在走向成熟,我们需要时间等待。以上提供的方案仅代表了一种基本的思路,在具体环境中需要做具体的调整。希望能起到一个抛砖引玉的作用。我的<span style="color: #108ac6;">联系方式</span>见Blog</span><span>,由于经验不足,有不正确的地方欢迎指正讨论。</span>
发表评论
-
HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合
2012-02-07 15:13 1100今天看着教程刚刷了台HD2,觉得有用的文章顺便转载过来 ... -
Hadoop配置部分内容
2012-02-04 15:29 741[size=medium;]Hadoop配置部分内容[ ... -
[转载]JPA 批注参考(1)
2012-02-04 11:39 725作为 Java 企业版 5 ... -
JVM 内存结构(转)
2012-02-03 14:49 899http://www.4ucode.com/Study ... -
JSP,PHP,Python,Ruby,Perl概要及各自特点
2012-01-31 15:18 994互联网技术日新月异,编程的语言层出不穷,原本稍微平静了 ... -
不要再浪费时间
2012-01-31 15:08 910不要再浪费时间 &l ... -
<<让oracle跑的更快1>>读书笔记2
2012-01-11 13:24 10231 绑定变量 1 ... -
Groovy Sql使用Spring的事务管理
2011-12-28 18:43 1287Grails如果不想用Hibernate的东东,可以直 ... -
Crack JRebel 4.0,无需重启JVM,热部署解决方案
2011-12-28 18:28 1170http://dl.dropbox.com/u/229 ... -
Linux tar压缩时排除某个目录或文件的参数
2011-12-21 13:48 1303在对某个目录进行压缩的时候,有时候想排除掉某个目录,例 ... -
2011面试题目之猴子偷桃
2011-12-21 11:14 1508<span style="" ... -
Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
2011-12-20 14:53 1602首先是准备工作 ... -
C#信息采集工具实现
2011-12-20 12:34 918简单C#信息采集工具实现 最近想整只爬虫玩玩,顺便熟 ... -
介绍一个ASP.NET开发工具Web Matrix
2011-12-19 09:49 966想学习或者开发个小型的ASP.NET程序,装个VS.N ... -
程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题
2011-12-19 09:24 916<font style="bac ... -
基于SVG的WebGIS的一个雏形
2011-12-14 13:19 680我和一位师弟,经过了很多天的努力,终于做出了一个简单的 ... -
在Android中自定义IOS风格的按钮
2011-12-12 10:09 1096<p class="MsoNorm ... -
HTML5网站
2011-12-12 08:55 809记得刚来现在公司的时候,老大就说,作为移动平台部门的员 ... -
将字节流(byte[])转换成文件
2011-12-09 08:25 1522/** * 将字节流转换成文件 * @par ... -
在SUSE 11中安装Windows虚拟机
2011-12-09 01:29 899Novell公司最近推出 ...
相关推荐
#### 大型高并发Web应用系统架构设计 **2.1 CDN内容分发** CDN是实现全球范围内快速访问的基础,通过在全球部署节点服务器,可以将热点内容分发至离用户最近的节点,大幅降低响应时间。 **2.2 负载均衡层** 负载...
综上所述,基于J2EE与Ajax的Web应用架构设计不仅可以提高系统的性能和用户体验,还可以通过合理的架构设计和模块化管理提升系统的可维护性和扩展性。这种设计方法不仅适用于客户关系管理系统,还可以广泛应用于其他...
软考系统架构设计师-论云原生架构及其应用范文 云原生架构是指基于微服务和容器技术的架构设计原则,它有四类设计原则:服务化、强韧性、可观测性和自动化。云原生架构可以将应用分解为多个服务,每个服务可以选择...
标题和描述概述的是“高并发高负载Web应用系统架构中的数据库架构策略”,这涉及到了数据库在Web应用系统中如何应对大规模用户访问、处理大量数据时的性能和稳定性问题。随着Web应用规模的增长,数据库作为数据存储...
### Web应用程序架构模式详解 #### 一、软件架构与架构模式概述 软件架构是指软件系统的设计蓝图,它定义了系统的组成、各个组成部分的功能及其交互方式。软件架构关注于软件的高层次设计,包括子系统和组件的划分...
在.NET应用系统架构设计中,我们探讨的核心是构建高效、可扩展且易于维护的软件解决方案。多层架构是一种常见的设计模式,它将应用程序分为多个独立的层次,每个层次专注于特定的功能,以提高代码的可重用性和可维护...
大型web系统架构动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册。1、学习Web开发原理,包括MVC/MTV等Web框架; 更多资源下载 ...
总结,本论文通过DSSA技术展示了在电力行业系统架构设计中的创新实践,结合了Rest服务的Web应用设计理念和软件可靠性原则,为构建智能电网的信息采集系统提供了有价值的参考。同时,项目管理策略的运用也体现了在...
系统架构设计师论文汇总是一份非常宝贵的资源,包含了38篇专为系统架构设计师准备的论文。这些论文不仅适合备考人员作为复习资料,还能够提供关于系统设计思路和方法的深入理解。通过对这些论文的研读,我们可以提炼...
针对Web2.0模式下海量数据和高并发的特性,本节将介绍一种基于廉价硬件平台的高性能、高并发、高扩展性的Web应用系统架构设计思路。该架构主要包括以下几个关键组成部分: - **前端负载均衡**:负责分发用户的请求...
《希赛第4版系统架构设计师教程》是针对全国计算机技术与软件专业技术资格(水平)考试中的系统架构设计师级别的权威教程。本教程旨在帮助备考者深入理解和掌握系统架构设计的相关知识,以顺利通过考试并提升实际...
ASP.NET Web应用系统项目开发是基于微软的.NET框架构建高效、安全且可伸缩的Web应用程序的方法。在本文中,我们将深入探讨ASP.NET Web应用系统的架构、开发流程、主要技术及其实现细节。 首先,ASP.NET是.NET ...
综上所述,Web系统的应用架构设计需要综合考虑负载均衡、服务解耦、高效通信和安全存储等多个方面。理解并优化这些层次,不仅可以提升Web应用的性能,也能增强系统的安全性,为用户提供更稳定、安全的服务。
在Web架构设计中,建立稳定的CI/CD流程对于保证代码质量和系统稳定性至关重要。 #### 性能监控与优化 持续监控Web应用的性能指标,如响应时间、吞吐量和错误率,可以帮助及时发现并解决问题。利用工具如New Relic...
《Java高手真经_系统架构卷:Java.Web系统设计与架构》是一本专注于Java Web开发领域的专业书籍,由刘中兵及其Java研究室倾力打造。这本书深入探讨了Java技术在构建复杂Web系统中的应用,涵盖了从基础概念到高级设计...
《Java高手真经_系统架构卷Java.Web系统设计与架构》这一资料主要聚焦于Java Web应用系统的高级设计与实现技术,对于希望深入了解Java Web开发、系统架构设计的技术人员来说,是一份不可多得的学习资源。下面将根据...
基于JSP+Servlet+JavaBean+JDBC+DAO的Web架构设计该系统,进一步了解并掌握如何对数据库进行操作,以及如何分析、设计一个应用系统。 需求要求: 该系统的基本需求是,系统要实现如下的基本管理功能: (1)用户分为...
书中可能会讲解如何使用ASP.NET MVC或ASP.NET Core构建Web应用程序,以及如何利用WCF(Windows Communication Foundation)或gRPC进行服务间通信。负载均衡、缓存策略(如Redis)和消息队列(如RabbitMQ)等技术也会...