比较传统开发模式下和.NET平台下开发程序有啥不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较传统开发模式下和.NET平台下开发程序有啥不同相关的知识,希望对你有一定的参考价值。

参考技术A 这样说明你具有了一定程度的系统设计能力。模块化业务复用结构就是这个这设计目标。这样有几个问题:使用一般处理程序来实现我数据读取的方法,会形成一些信息孤岛。如果你的整个程序都是与网页打交道,建议你使用webapi技术,api可以跨浏览器服务,也有利用将来业务模块的复用。如果业务较为复杂,建议api只是组装业务(如果基本认证和几个业务模块的组合),而真正的业务模块可以考虑使用wcf技术。思路是wcf是最小的业务模块,比如wcf中存在身份认证功能,存在token分发功能,存在授权功能,存在基本业务功能,而webapi功能可以调用wcf中的授权功能,如果授权成功,则调用wcf的基本业务功能。这样wcf处于基本业务层(处理业务逻辑与非业务功能需求),而webapi可针对不同的wcf功能进行组合封装,提供给页面或外部其他企业联合调用。wcf进行系统化分部分,而且考虑到wcf的分布部署等多重部署方案,wcf其中一个节点失效则可以使用另一个部署节点。如果单纯的是一般处理程序,则在部署时需要考虑使用负载均衡进行地址的转换,对于将来这种松散的维护等都不是优势。其他的条目其实只说明了前端。前端在整个系统架构中只是极小的一部分而已。至于前端使用何种方式调用,那只是处于安全等各个方面的考虑而定义的。在我看来,使用ajax调用,其实你的意思只是实现了无刷而已(无刷新页面而调用数据),这种方案实现的方案有很多,比如.net中存在多个无刷控件可以使用。但事实上刷新页面还是局部刷新(无刷)都只是页面的体验问题,整个系统设计时,并不是设计的前端,而是整个系统——要考虑到将来的维护成本,还有复用率等等多种因素,前端是否无刷也只是系统设计中的一个而已。比如后端在设计时,不管你使用handler还是api,它与你页面表现没有任何关系。你使用模块开发这个概念是不正确的,这里是层级开发,不是模块开发,模块指的是业务分布问题,而层级指的是业务调用问题,如果说模块,你其实应该说进锁存分为三个子系统:进、销、存这个三个系统模块(注:模块有大有小,一个子系统是一个模块,一个功能也是一个模块)webapi的调用有多种,页面后端(aspx页面可以调用,服务器调用,但如果涉及到服务器调用时,建议使用服务器直接调用wcf即可,当然也可以调用api根据不同的功能特性而定),浏览端调用(javascript或ajax等封装库调用),api的做用是跨浏览器(可被手机浏览器或其他应用程序调用,也叫跨终端),wcf的做用是跨语言(可供不同的语言调用,如php/java等后端调用)及业务基础逻辑的定义,其他wcf也可以被浏览器调用,但这种形式的wcf叫wcfrestful风格(事实上webapi就是在http协议上来代替wcfrestful的,wcfrestful是使用soap协议)。然后我这里给你介绍一下handler与webapi的区别:handler其实是对请求-应答过程中的事件进行了定义,在iis的19个事件中定义其process功能然后进行返回,换句话来说,handler会自动注册,然后请求到达时执行相关的handler,最后流程走到process事件中,这个都是handler定义好的(就是你直接使用的一般处理程序),如果你需要定义其他的事件,那么必须自定义handler/module,你可以看到其实一般处理程序就是继承了一个IHttphanlder的接口原因。而webapi则是对所有事件进行处理而衍生的一个开发框架(webapi在mvc4中出现,由于其比交好用,在mvc5中驳离,而形成新的轻量级开发架框webapi2.0,所以webapi现在还保留着其mvc开发风格)所以webapi非常适应你说的情况。也就是说你将来的网站后台有两部分组成,一部分是aspx页面(或直接html页面/建议使用shtml),本来应该写在aspx.cs文件中的内容,全部省略,而写在前端由javascript/ajax去调用。举一个不恰当的例子——你的服务器按钮(asp:Button/或buttonrunat=server,能触发服务器事件的按钮),本来应该写到相应的后端事件中,而现在则由前端进行了分解,从而实现页面级业务分离,达到了复用的功能。可能这样说不够直白,假定asp:ButtonOnClick=serverClickHandler,那么本来在aspx页面中应该存在一个serverClickHandler(objectsender,EventArgse)的事件,这个事件就是服务端事件,它会引发页面刷新。现在我们把serviceClickHandler事件设计成一个webapi功能,则asp:ButtonOnClientClick=ajaxHandler,在ajaxHandler中使用ajax或直接使用javascript去调用一个地址(这个地址就是api地址,它可以返回xml/json/jsonp格式的数据,然后由javascript获得的数据直接进行处理。使用httphandler也不过如此,所以使用webapi则会更有优势。而且api组装业务时,如果有两个页面需要同样功能时,aspx写在后台时,肯定无法重用另一个页面的中一个事件(其实为了重用,页面还需要按照命令模式进行设计),而分离的handler还api则不存在这样的问题,只是前端ajax调用时调用同一地址而已)。我们再来看一下,为什么要使用wcf做基础业务逻辑。如果你的webapi/handler出现一个问题,几乎所有的handler都需要认证(认证调用者身份,然后处理不同的业务),相把相同的部分提出来(认证调用者身份),这样就形成了两者基础业务逻辑,如果认证模块发生了变化,则基础业务进行修改就是,不会影响调用者的任何代码;但如果认证调用者身份没有复用,那么一个个地修改,这事是每个程序员的恶梦——当然,你可以完全考虑使用一个抽象类,让需要调用的功能继承,但这里我只是说的业务复用,如果真是仅仅的身份验证是没有问题的,但业务中并非简单的业务,业务是可拆分的,拆分后可能会被不同的业务调用,而且没有多少共性,这时涉到的就是业务组装,不可能使用继承的方法完成的。这就是使用wcf做基本业务逻辑处理层的原因之一(其他的是考虑业务有效性、稳定性、吞叶量等)。后端编程,如果技术团队还行的话,可以考虑使用aop(面向切面编程),因为大多数的情况,一个基础业务可能会涉及到日志记录等等,每个都存在这样的方式时,就考虑使用切面编程(切片编程)的编程风格,对将来的系统更易于维护。这么说吧,设计一个系统是架构师的事,其实要考虑的内容多了去了,目标也不是仅仅的业务能走通,而是考虑到开发周期,维护成本等等诸多方面。

ASP.Net MVC开发基础学习笔记:走向MVC模式

一、ASP.Net的两种开发模式

1.1 ASP.Net WebForm的开发模式

(1)处理流程

在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由index.aspx页面来呈现给用户。

综上所述,在WebForm模式下:一个URL请求的是在服务器与该URL对应路径上的物理文件(ASPX文件或其他),然后由该文件来处理这个请求并返回结果给客户端。

(2)开发方式 • 服务器端控件 • 一般处理程序+Html静态页+Ajax • 一般处理程序+Html模板引擎

1.2 ASP.Net MVC的开发模式

(1)处理流程

在ASP.Net MVC中,客户端所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。再说回前面我们运行的ASP.NET MVC程序访问的http://www.aspnetmvc.com/Home/Index这个URL,它访问的其实是HomeController中的Index这个Action。

(2)显著特点 • 2009年第一个开源项目版本发布,至今已过去5年,发展逐渐完善 • 更加简洁,更加接近原始的“请求-处理-响应” • 更加开发、更多的新的特点、社区活跃 • 不会取代WebForm • 底层跟WebForm都是一样的,只是管道上不同的处理而已

二、MVC模式的两种不同解读

MVC 模式两种理解:一种是表现模式,另外一种是架构模式。它将应用程序分成三个主要组件即:视图(View)、控制器(Controller)和模型(Model)。现在,我们来看看M-V-C分别代表什么?

M:Model 主要是存储或者是处理数据的组件;Model其实是实现业务逻辑层对实体类相应数据库操作,如:CRUD。它包括数据、验证规则、数据访问和业务逻辑等应用程序信息。(补充:ViewModel:视图模型) V:View 是用户接口层组件。主要是将Model中的数据展示给用户。aspx和ascx文件被用来处理视图的职责; C: Controller 处理用户交互,从Model中获取数据并将数据传给指定的View; (1)MVC作为架构模式的理解

作为架构模式时,View的职责就是负责展示数据,而Controller则负责获取View传递来的数据,然后调用业务逻辑层处理完成的数据传递给View进行展示。而Model则处理业务逻辑,并把结果返回给Controller。从传统三层架构上来看,View和Controller都属于UI层,而Model则横跨BLL与DAL层。

(2)MVC作为表现模式的理解

(3)MVC架构模式综合模型

可以看出,对于MVC的两种不同理解的区别就在于对于Model的理解上:将Model作为业务模型(BLL、DAL等)还是作为视图模型(ViewModel)

三、WebForm vs MVC

(1)WebForm

优点: 1.提供了大量的服务器端控件,可以实现快速开发;

2.ViewState回传数据很方便;

3.学习成本低;

缺点: 1. 封装太强,虽然学习成本低,很多底层东西让初学者不是很明白;

2. 自定义控制不灵活,不利于美工和开发人员的配合,往往那些服务器控件处理稍有不慎就会导致出错;

3. ViewState在页面中的传递会造成大量的流量消耗;

TIP:有关WebForm的服务器控件和ViewState的详细介绍,不了解的朋友可以阅读另一篇博文《ASP.Net WebForm学习笔记:aspx与服务器控件探秘》。

(2)MVC

优点: 1.很容易将复杂的应用分成Model(ViewModel)、View、Controller三个组件模型,将处理后台逻辑代码与前台展示逻辑进行了很好的分离,属于松耦合关系,在大项目应用中,更易于敏捷开发与测试驱动开发,有很强的可扩展性;

2.因为没有服务器端控件,所以程序员控制的会更加灵活,页面更加干净,没有ViewState;

3.通过修改路由规则,可以控制生成自定义的url,因此控制生成SEO友好的URL将更加容易;

4.强类型View实现、Razor视图、Model绑定机制、Model的验证机制,更安全高效;

缺点: 学习成本高,结构复杂,对未变化数据的不必要的频繁访问,也将损害操作性能。

四、第一个ASP.Net MVC程序

4.1 新建项目后的文件组织结构

(1)新建一个ASP.Net MVC 4项目,选择“基本”配置与“ASPX”视图引擎(暂时不用Razor引擎)。

(2)VS为我们生成的基本文件组织结构如下图所示:

可以看出,VS默认帮我们创建好了Models、Views以及Controllers的三个文件夹,这三个文件夹就构成了我们的ASP.Net MVC模式的项目。其中,Controllers是所有控制器的类文件所在,而Models则是所有模型的类文件所在,而Views则是所有cshtml或aspx的文件所在。

4.2 控制器的“约定大于配置”

在Controllers中新建一个控制器,取名为HomeController。在默认的Index这个Action中新建一个视图,默认名为Index即可。 (1)Controller放到controllers文件夹中,并且命名方式以Controller结尾

(2)每个Controller都对应View中的一个文件夹,文件夹的名称跟Controller名相同 (3)Controller中的方法名都对应一个View视图(非必须,但是建议这么做)而且View的名字跟Action的名字相同 (4)控制器必须是非静态类,并且要实现IController接口 (5)Controller类型可以放到其他项目中

4.3 视图的相关约定

(1)所有的视图必须放到Views目录下 (2)不同控制器的视图用文件夹进行分割,每个控制器都对应一个视图目录 (3)一般视图名字跟控制器的Action相对应(非必须) (4)多个控制器公共的视图放到Shared:例如公用的错误页、列表模板页、表单模板页等等;

4.4 数据传递的桥梁-ViewData与ViewBag

首先,ViewData是一个Key/Value对的字典集合数据结构,用于在Controller和View之间构建起传递数据的桥梁。 (1)ViewData是Controller的属性,此属性是继承ControllerBase而来

(2)ViewPage下也有一个ViewData的一个属性

(3)控制器的Action方法执行完成后,返回ViewResult,然后MVC框架在执行ExcuteResult方法时,Controller中的ViewData数据会传递给ViewPage类,其实就是把Controller的ViewData赋值给ViewPage页面的ViewData属性。 (4)ViewBag传递数据:我们对ViewBag的动态属性进行赋值,值实际上是存到了ViewData中,动态属性的名存成了ViewDataDictionary的键,动态属性的值存成了ViewDataDictionary的值。

PS:ViweBag其实是就一个包含了一层Dynamic的ViewData,两个兄弟共用的是一个容器。

(5)ViewData与ViewBag的比较

ViewData ViewBag
它是Key/Value字典集合 它是dynamic类型对像
从Asp.net MVC 1 就有了 ASP.NET MVC3 才有
基于Asp.net 3.5 framework 基于Asp.net 4.0与.net framework
ViewData比ViewBag快 ViewBag比ViewData慢
在ViewPage中查询数据时需要转换合适的类型 在ViewPage中查询数据时不需要类型转换
有一些类型转换代码 可读性更好

(6)如何在程序中使用ViewData与ViewBag

①在Controller中的代码

 

②在View中的代码

 

4.5 路由机制初步了解

我们通过调试可以知道,在MVC中所有的请求都归结到控制器下面的Action。所以,所有的请求都是要指定一个具体的Action,Url的格式是根据路由规则来定的。那么,在ASP.Net MVC的路由规则默认又是什么,在哪里设置的呢?

打开App_Start文件夹,可以找到RouteConfig这个类,查看RouteConfig这个类的方法,可以知道原来是RegisterRoutes这个方法为我们的ASP.Net MVC项目设置了默认的路由规则:{controller}/{action}/{id},也就是说我们可以通过http://localhost/Home/Index/1这种URL来访问项目。如果我们想要改变默认的路由规则,例如我们想要以这种URL:http://localhost/Home-Index-1来访问项目,则直接将上面的默认路由规则改为:{controller}-{action}-{id}即可。

参考文章

(1)lulu Studio,《ASP.Net MVC入门:1-简介》,http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html

(2)马伦,《ASP.Net MVC基础视频教程》,http://bbs.itcast.cn/thread-26722-1-1.html

(3)深山老林,《正确认识WebForm与ASP.Net MVC》,http://www.cnblogs.com/wlb/archive/2009/12/07/1618954.html

(4)zhaojunpeng,《ViewData和ViewBag的那些事》,http://blog.segmentfault.com/zhaojunpeng/1190000000472818

以上是关于比较传统开发模式下和.NET平台下开发程序有啥不同的主要内容,如果未能解决你的问题,请参考以下文章

低代码开发平台有啥特点?

.NET(c#) 移动APP开发平台之Smobiler开发

小程序相对APP有啥优势?

深入.NET平台的软件系统分成开发(1/6)

机器视觉方面都有哪些好的开发平台?各有啥特点

无代码开发与传统开发有什么不同?