应用程序框架实战三十:表现层及ASP.NET MVC介绍(一)
本文将介绍表现层及ASP.NET MVC的一些要点,特别是ASP.NET MVC的一些抽象和封装技巧,如果你对MVC还不了解,可以参考《ASP.NET MVC4 高级编程》,作者Jon Galloway等,这本书由ASP.NET MVC团队成员编写,相当不错。
表现层的职责
表现层的职责是展示和收集数据,将领域层的数据和逻辑展示出来,并收集用户输入的相关信息。
搞清楚表现层的职责以后,你就应该清楚,表现层不是你应该编写业务逻辑的地方,这也是分层架构的核心。
如果要展示一个计算值,不应该在表现层直接完成计算,相反,由领域层进行计算,表现层直接拿到结果并展示,这样可以让表现层代码非常简洁,同时业务逻辑被高度内聚到领域层。
很多时候,为了提升用户体验,我们会在页面上使用Js进行客户端计算,从而获得快速响应,但也导致业务逻辑泄露到Js中。在大多情况下,这是可以接受的,不过在你准备用Js编写这些重复逻辑时,可以先考虑是否可以使用Ajax请求服务端完成。每当你需要进行客户端实时计算时,就发送请求给服务端,领域层完成计算,返回结果。
尽量减少业务逻辑副本,当需求变化或发现BUG时,代码同步更轻松。
对于管理系统来说,尽量让程序员少写Js,尽量封装和抽象,因为Js是弱类型,没有编译时检查,代码提示很弱,哪怕使用了Resharper,代码提示功能依然不佳,细长的提示滚动条,看得你两眼直冒金星。另外Js很多技巧看上去很怪异,初学者使用这些技巧,Bug率将大幅上升。当项目交给新人维护,长篇的Js更使其痛苦不堪。当然这是给普通团队的建议,少写Js可以让你的项目容易维护,高水平团队请忽视。
Mvc介绍
MVC是一个表现层架构模式,将表现层分成三个部分,模型、视图和控制器。
当Http请求发送到ASP.NET MVC引擎时,MVC引擎查找路由表以决定由哪个控制器操作来处理这个请求。
控制器是一个指挥中心,它调用后端的服务,并将得到的模型交给视图显示。
你可以直接在控制器方法中操作DbContext或仓储,并使用Linq语句进行查询。当你逐步意识到控制器代码变得复杂时,可以创建应用层服务来简化表现层。
应用服务为表现层提供唯一的API访问点,大幅降低控制器复杂度,控制器的所有操作,都通过应用服务一个明确的API完成,不仅操作更规范,而且控制器将变成很薄的一层。
控制器的开发要点是,保持尽量简单,没事少写代码。把你的需求交给应用层服务去实现,你只需要简单调用其接口就行了。
模型是指数据与业务逻辑,即领域模型,大部分时候,你可以在MVC视图中直接操作领域实体,视图模型ViewModel不是必须的。不过出于某些原因考虑,视图中操作的也可能是DTO或ViewModel,当界面变得复杂时,通过为特定视图引入专门的ViewModel 可以简化界面开发。
你可能已经发现了名目繁多的实体类型:领域实体、DTO、ViewModel、查询实体等,确实让人眼花缭乱,我将在后续用专文讨论,以方便你根据需要取舍。
约定优于配置
“约定优于配置”原则,建议你尽量遵循默认约定,并形成习惯,这样可以大幅降低学习成本和工作量,同时获得更一致的目录结构和代码风格,查找特定类型的文件变得非常容易,可维护性大大提高了,你仅在必要时才需要通过配置来覆盖默认值。
“约定优于配置”原则对目录结构和命名产生了深远影响。
项目的目录结构至关重要,但大部分程序员对目录结构不太关心,因为创建文件夹没有技术含量,简单的容易被忽视。
当你准备修改某个功能时,第一步起码先得找到相关的文件。
如果你平时不太注意目录结构的管理,创建文件很随意,随便找个地方就扔进去了,随着项目文件的增多,你的开发工作将会越来越乱,当你要找某个文件时,你会在目录树中四处乱点,“哦,不在这,哦,也不在那,哦耶,终于找到了”。
当你要找一个控制器时,你会去查找Controllers目录,而不是一个叫ABCD的目录,这就是命名约定。如果存在一个名为TestController的控制器,默认在Views目录中就会有一个Test的目录与之对应,这样在查找控制器对应的视图时就能非常轻松。
当你的所有文件都能够根据约定,分门别类的放到清晰命名的目录中时,整个项目的质量将大幅提升。
我在封装EasyUi时,把控件Id的命名作了一些约定,比如表格叫grid。这样很多Js回调函数,就可以在内部完成,不需要你手工处理了,如果你遵循这些约定,开发一个简单的EasyUi CRUD操作,基本不需要写Js。
.Net应用程序框架交流QQ群: 386092459,欢迎有兴趣的朋友加入讨论。
谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/xiadao521/
应用程序框架实战三十:表现层及ASP.NET MVC介绍(一)的更多相关文章
- 应用程序框架实战三十三:表现层及ASP.NET MVC介绍(二)
最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间.不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新.本文继续介绍表现层和Asp.net Mvc,我将在本篇讨论一些 ...
- 表现层及ASP.NET MVC介绍(一)
表现层及ASP.NET MVC介绍(一) 本文将介绍表现层及ASP.NET MVC的一些要点,特别是ASP.NET MVC的一些抽象和封装技巧,如果你对MVC还不了解,可以参考<ASP.NET ...
- 表现层及ASP.NET MVC介绍(二)
表现层及ASP.NET MVC介绍(二) 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间.不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新.本文继续介绍表现层和 ...
- 应用程序框架实战三十八:项目示例VS解决方案的创建(一)
进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的 ...
- 应用程序框架实战三十六:CRUD实战演练介绍
从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...
- 应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较
本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较. 领域实体为何不能一统江湖? 当你阅读 ...
- 应用程序框架实战二十二 : DDD分层架构之仓储(层超类型基础篇)
前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能. 仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合.仓储中有很多操作都是可以通用的,可以把这部分操作抽取到 ...
- 【WePY小程序框架实战三】-组件传值
[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 父子组件传值 静态传值 静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型. 父组件 (paren ...
- 应用程序框架实战三十七:Util最新代码更新说明
离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考. 重要更新 这一次对两个VS解决方案 ...
随机推荐
- browsersync实现网页实时刷新(修改LESS,JS,HTML时)
var gulp = require("gulp"), less = require("gulp-less"), browserSync = require(& ...
- canvas图片处理
1.灰度 .299 * r + .587 * g + .114 * b; 2.连环画效果 R = |g – b + g + r| * r / 256 G = |b – g + b + r| * r / ...
- iphone中input标签会多出一块的解决办法
-webkit-appearance: none;
- 关于learntorank http://qiita.com/rockhopper/items/bb3d46f01df5f6499123
一.数据转换 如何对于训练数据做pairwise的transform,比如你原始数据是要么点击要么不点击,如何对这些样本数据做pairwise的transform? 下面的方法主要是做组合的方法,就是 ...
- HDU(1285)—确定比赛名次
/*最近都在复习期末了...好久没做题,都快没智商了*/ 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后 ...
- *HDU2254 矩阵乘法
奥运 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- redis 操作
redis 1 启动服务 redis-2.8.20 wangchengcheng$ pwd /Users/wangchengcheng/Documents/GameJelly/server/redis ...
- 导入导出Excel工具类ExcelUtil
前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...
- Zend Studio XDebug调试配置
最近在配置zend studio时找了些资料,发现了这个,说的比较详细 搭建Zend Studio 10.5 和XDebug 环境,试图进行 Drupal的调试, 经历了一些困难,但是最终解决了问题, ...
- AFNetWorking
目录: 1.为什么要用AFNetworking 2.AFNetworking的用法 一.为什么要用AFNetworking 在ios开发中,一般情况下,简单的向某个web站点简单的页面提交请求并获取服 ...