InfoQ

新闻

用新一代.NET技术构造N层Web应用

作者 王翔 (Vision Wang) 发布于 2008年2月26日 上午5时33分

社区
.NET
主题
故事和案例分析,
架构
标签
LINQ

近期,Dan Wahlin在其博客上发表的一篇名为《Building an N-Layer ASP.NET Application with LINQ, Lambdas and Stored Procedures》的文章颇引人注目,该文使用.NET 3.5版本新引入的LINQ、Lambda表达式实现了一个基于Northwind数据库的在线电子商务应用,该文同时也勾起.NET社区对如何设计下一代N层应用的思考和讨论。

该应用被划分为4个层次,除了表现层(Presentation Layer)、业务逻辑层(Business Layer)和数据访问层(Data Access Layer)之外,抽象了一个业务模型层(Model Layer),该层用XSD(XML Schema)定义了与具体数据访问技术无关的业务实体模型,目的是保证无论底层数据访问技术采用LINQ to SQL设计器生成的类型、还是自己组织Lambda表达式或者是直接通过访问存储过程的方式,都可以向上层应用提供模型层定义的标准动态业务实体。该示例应用的逻辑分层如下:

 

说明:

  • 展现层采用非异步方式的标准ASP.NET;
  • 业务逻辑层基于模型层的对象实体,借助数据访问层ORM之后的关系对象完成与持久层的交互;
  • 数据访问层采用LINQ方式,通过访问LINQ设计器生成的关系对象、自定义Lambda表达式生成的关系对象以及借助存储过程生成的关系对象,所有关系对象按照模型层的要求生成匹配的业务实体;

 部署上,业务层、模型层和数据访问层的程序集部署在Web服务器上,供ASP.NET页面的数据绑定服务端控件调用。

从技术使用上,这个示例比较适合作为LINQ的动手实验项目,不过如果再次审视这个项目,似乎更应该称之为“玩具”应用:

  • 计算扩展能力相对薄弱,整个体系的计算全部集中在Web服务器部分,而且Business、Model、Data Access三层间没有抽象出代理类型,因此如果不做改造的话无法把相关计算部署到其他进程或服务器内;
  • 虽然是一个业务示例,而且也牵涉面向数据的CRUD操作,但欠缺了有关事务性控制的内容;
  • 作为一个面向Web的开放式应用,在Model定义部分一直在采用.NET自己的类型定义业务实体,阻滞了其他平台(J2EE、Ruby、PHP…)与之互操作的能力;
  • 因为采用标准ASP.NET访问二进制程序集的方式,并没有开放的服务接口,影响外部应用的进一步扩展,以及B2B操作的协同;考虑到Customer表、Country表结构相对简单的特点,如果每个Web操作都需要提交,可能用户体验要逊色些,因此可以考虑增加异步处理能力;
  • 还有一个就是如果要扩展为面向实际生产的系统,可能需要增加全程的运行监控、维护和安全控制措施;

相关赞助商

InfoQ中文站.NET社区,关注.NET和微软的其他企业开发解决方案,通过新闻、文章、视频访谈和演讲以及迷你书等为中国.NET社区提供一流资讯。

没有回复

回复

独家内容

书评:敏捷模式──指向成功的路标

Ryan Cooper对Amr Elssamadisy的新书发表了评价,并认为书中提供了一种为实施敏捷量身定做的框架。本书并没有给出一种人人可用的敏捷方法,而是为读者提供一些模式和工具,用以找出哪些敏捷实践可以最有效地达到该组织机构的特定目标。

构建的可伸缩性和达到的性能:一个虚拟座谈会

这个由业界主要专家们参加的座谈会探究了在使应用程序具备尽可能好的伸缩性及性能的过程中所面临的挑战和思考过程。

OpenSocial的分析与实现

本视频主要对OpenSocial进行了分析,并对实现的方式进行了介绍。其中包括:OpenSocial的开发经验、Container Provider的技术准备、平台的构成要素、具体的规范、以及对未来的展望。

缓存系统MemCached的Java客户端优化历程

Memcached在大型网站被应用得越来越广泛,但是Java客户端并不多,本文作者基于现有的开源客户端进行了封装优化,并翔实记录了这一过程。

超越SOA:动态业务应用的新企业应用框架(2)

在他们文章的第二部分,作者探讨了动态业务应用的架构并介绍了资源容器的概念。他们示范了如何在JEE之上构建这个架构,以及它如何影响实现生产力。

使用ClickOnce细分发布版本

ClickOnce让WinForms应用程序的部署轻而易举。David Cooksey演示了如何在ASP.NET中编写一个HttpHandler来实现对ClickOnce部署的版本细分。

敏捷教练,从A到Z

敏捷带来了新的领导者角色,“敏捷教练”。它是不是跟“部门经理”或“技术领导”一样,只是换汤不换药呢?教练Pat Kua在这篇启蒙文章中对敏捷教练一职做了概述。

利用Ruby简化你的Java测试(进阶篇)

本文是Productive Java with Ruby系列文章的第二篇,通过上一篇的介绍,我想大家对如何利用Ruby进行单元测试有了一个基本的了解,从这里开始,我将和大家一起讨论一些利用Ruby进行单元测试时的高级话题。