大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> 基于.NET的Web应用框架构建模式

基于.NET的Web应用框架构建模式

时间: 2021-07-31 作者:daque

[简介]正文对应于web表白形式集群,作品的前半局部重翰墨的刻画了mvc形式的框架结构、安排及其asp.net实行,而在越发搀杂的体例中,随后提出了page controller(页面遏制器)和front controller(前者遏制器)动作mvc实行的弥补,结果,扼要引见了web表白形式集群的其余两个形式:intercepting filter(挑选器)和page cache(页面缓存)形式。“体制构造安排者的第一个大作常常比拟简单和纯洁。他领会本人并不领会正在举行的处事,所以他粗枝大叶地安排它。在他安排第一个大作时,会举行屡次化装和润饰。那些会留到“下一次”运用……这第二个体例是他已经安排的最伤害的体例……普遍趋向是,在安排第二个体例时,将会运用在第一个大作中被提防抛弃在一面的一切思绪和化装,进而引导安排过了头。”—frederick p. brooks, jr.公布于1972年的the mythical man month(人月传奇)。web上创造的第一个体例是大略地链接在一道的静态html页面,再不在分别的小组之间共享文书档案。跟着用户的运用量减少,可相应用户输出的动静网页日益一致。早期的动静页面普遍是以通用网关接口(cgi)剧本的情势编写的。那些cgi剧本不只包括用来决定在相应用户输时髦该当表露什么实质的交易论理,并且还会天生表白html。跟着对更搀杂论理需要的减少,对更充分、更灵巧的表白情势的需要也随之减少。这种减少了的搀杂性给cgi编制程序模子带来了挑拨。不久,鉴于页面包车型的士开拓本领(如asp和jsp)展示了。那些新本领承诺开拓职员将剧本径直嵌入到html面中,进而简化了编制程序模子。当那些嵌入的剧本运用步调变得更搀杂时,开拓职员蓄意在页面级别将交易论理与表白论理划分。为符合这一诉求,随之展示了具备扶助器东西和代码湮没页面战略的标志库。而后,又展示了供给动静摆设站点导航和吩咐安排步调的精致框架,但一切这十足都是以减少搀杂性为价格的。假如此刻有洪量的web表白可选计划,怎样为您的运用步调采用符合的web表白安排战略?能否真的有一个安排战略不妨符合一切的情景?很悲惨,在软硬件安排中,取消过多的冗余和过渡的搀杂性是一个比赛性需要,很难不妨真实做到两者之间的平稳。您不妨从包括嵌入剧本的大略页面发端安排处事,但很快交易论理就会连接反复出此刻各个文献中,进而引导体例难以保护和扩充。经过将该论理移到一组协调组件中,不妨取消冗余,然而如许做会减少处置计划的搀杂性。另一上面,您的安排处事不妨从安排用来供给标志库、动静摆设和吩咐安排步调的框架动手,然而如许固然不妨取消冗余代码,但它会大大减少体例的搀杂性,而这常常是不需要的。而怎样商量各个上面的需要,提出一个最符合咱们运用的web表白战略呢?这须要在搀杂处置计划(扶助未来大概爆发变革的景象)和大略处置计划(满意暂时的诉求)之间做出决定,规则上符合减少本钱是可取的,而过多减少本钱却是不行取的。那么空话少说,咱们就从“大略”发端吧。mvc(模子—视图—遏制)很多计划机体例的用处都是从数据保存检索数据并将其表露给用户。在用户变动数据之后,体例再将革新实质保存到数据保存中。由于要害的消息流爆发在数据保存和用户界面之间,以是您大概目标于将这两局部绑在一道,以缩小源代码量并普及运用步调本能。然而,这种看上去自但是然的本领有少许大题目。一个题目是,用户界面包车型的士变动常常比数据保存体例的变动一再得多。将数据和用户界面这两局部啮合在一道带来的另一个题目是,交易运用步调常常会并入远不只数据传输功效的其余交易论理。怎样让web运用步调的用户界面功效实行模块化,再不您不妨轻快地独立窜改各个局部?model-view-controller恰是如许的形式,它实行功效模块和表露模块的辨别,使得运用步调越发可保护,可扩充,可移植和可复用,它首先是trygve reenskaug在二十世纪七十岁月末为smalltalk平台开拓的框架[fowler03],而兴盛到暂时为止,仍旧产生了一个特殊老练的形式。mvc处置计划model-view-controller (mvc)形式鉴于用户输出,将域的建立模型、表露和操纵分为三个独力的类[burbeck92]:q模子。模子用来管理当用步调域的动作和数据,并相应为获得其状况消息(常常来自视图)而发出的乞求,还会相应变动状况的训令(常常来自遏制器)。q视图。视图用来处置消息的表露。q遏制器。遏制器用来证明用户的鼠标和键盘输出,以报告模子和/或视图举行相映的变动。视图和遏制器都依附于模子。然而,模子既不依附于视图,也不依附于遏制器。这是辨别的重要便宜之一。如许的辨别承诺模子在独力于可视表白功效的情景下创造和尝试。在很多胖存户端运用步调中,视图与遏制器的辨别是其次的,本质上,很多用户界面框架将脚色实行为一个东西。另一上面,在web运用步调中,视图(欣赏器)与遏制器(处置http乞求的效劳器端组件)的辨别是很好设置的。model-view-controller是一个用来将用户界面论理与交易论理分摆脱来的普通安排形式。可惜的是,此形式的普遍引导了很多缺点的刻画。更加是在各别的左右文中,术语“遏制器”仍旧用来意指各别的实物。倒霉的是,web运用步调的展示仍旧扶助取消了少许不精确性,由于视图与遏制器的辨别是如许鲜明。mvc的变型在application programming in smalltalk-80: how to use model-view-controller (mvc) [burbeck92]中,steve burbeck刻画了mvc的两个变型:被迫模子和积极模子。当一个遏制器以独吞办法操纵模子时,将运用被迫模子。遏制器将窜改模子,而后报告视图:模子仍旧变动,该当举行革新(见图2)。此情景下的模子实足独力于视图和遏制器,这表示着模子没辙汇报其状况变动。http和议是此计划的示例。欣赏器没有从效劳器获得异步革新的简片面法。欣赏器表露视图并对用户输出作出相应,然而它不会检验和测定效劳器上的数据变动。仅当用户显式乞求革新时,才会咨询效劳器能否爆发了变动。当模子变动状况而不波及遏制器时,将运用积极模子。当其余资源正在变动数据而且变动必需反应在视图中时,大概会爆发这种情景。以股票报价机的表露为例。您从外部源接受股票数据,并蓄意当股票数据变动时革新视图(比方,报价机数据区和劝告窗口)。由于惟有模子检验和测定对其里面状况的变动(在那些变动爆发时),以是模子必需报告视图革新表露。然而,运用mvc形式的一个手段是使模子独力于视图。即使模子必需将变动报告视图,则会从新带来您蓄意制止的依附性。倒霉的是,observer形式[gamma95]供给了如许的体制:指示其余东西提防状况的变动,而不会引导对那些东西的依附性。各个视图实行observer接口,并向模子备案。模子将盯梢由订阅变动的一切查看器构成的列表。当模子爆发变换时,模子将会遍历一切已备案的查看器,并将变动报告它们。此本领常常称为“颁布-订阅”。模子从不须要相关任何视图的一定消息。本质上,在须要将模子变动报告遏制器的情景下(比方,起用或禁止使用菜单选项),遏制器必需做的十足处事是实行observer接口并订阅模子变动。对于生存很多视图的情景,设置多个主体是有意旨的,个中每个主体都刻画了一定典型的模子变动。而后,每个视图都只能订阅与视图相关的变动典型。图3表露了运用observer的积极mvc的构造,以及查看器怎样将模子与径直援用视图隔摆脱来。图4证明当模子爆发变换时observer怎样报告视图。怅然的是,在一致建立模型谈话(uml)序列图中,没有好的本领来演练模子与视图的辨别,由于该图表白的是东西的范例而不是类和接口。mvc的asp.net实行为领会释怎样在asp.net中实行model-view-controller形式,并证明在软硬件中辨别模子、视图和遏制器脚色的长处,底下的示例将一个没有辨别一切三个脚色的单页面处置计划重构为辨别这三个脚色的处置计划。示例运用步调是一个带有下拉列表的网页(如栏下图所示),该页面表露了保存在数据库中的记载。运用microsoft visual studio(r) .net开拓体例的代码湮没功效,不妨很简单地将表白(视图)代码与model-controller代码分摆脱来。每个asp.net页都有一种体制,这种体制承诺在独立的类中实行从网页挪用的本领。该体制是经过visual studio .net供给的,它有很多便宜,比方microsoft intellisense(r)本领。当您运用代码湮没功效来实行网页时,不妨运用intellisense来表露网页反面的代码中所运用的东西的可用本领列表。intellisense不实用于.aspx页。与此同声,为了展示model-controller的辨别,对于数据库操纵索取了databasegateway,如许就实行了三者的完备辨别。视图<%@ page language="c#" codebehind="solution.aspx.cs" autoeventwireup="false" inherits="solution" %><html> <head> <title>处置计划</title> </head> <body> <form id="solution" method="post" runat="server"> <h3>灌音</h3> 采用灌音:<br/> <asp:dropdownlist id="recordingselect" runat="server" /> <asp:button id="submit" runat="server" text="submit" enableviewstate="false" /> <p/> <asp:datagrid id="mydatagrid" runat="server" width="700" backcolor="#ccccff" bordercolor="black" showfooter="false" cellpadding="3" cellspacing="0" font-name="verdana" font-size="8pt" headerstyle-backcolor="#aaaadd" enableviewstate="false" /> </form> </body></html>模子using system;using system.collections;using system.data;using system.data.sqlclient;public class databasegateway{ public static dataset getrecordings() { string selectcmd = "select * from recording"; sqlconnection myconnection = new sqlconnection( "server=(local);database=recordings;trusted_connection=yes"); sqldataadapter mycommand = new sqldataadapter(selectcmd, myconnection);dataset ds = new dataset();mycommand.fill(ds, "recording");return ds; } public static dataset gettracks(string recordingid) { string selectcmd = string.format( "select * from track where recordingid = {0} order by id", recordingid); sqlconnection myconnection = new sqlconnection( "server=(local);database=recordings;trusted_connection=yes"); sqldataadapter mycommand = new sqldataadapter(selectcmd, myconnection); dataset ds = new dataset(); mycommand.fill(ds, "track"); return ds; }遏制using system;using system.data;using system.collections;using system.web.ui.webcontrols;public class solution : system.web.ui.page{ protected system.web.ui.webcontrols.button submit; protected system.web.ui.webcontrols.datagrid mydatagrid; protected system.web.ui.webcontrols.dropdownlist recordingselect; private void page_load(object sender, system.eventargs e) { if(!ispostback) { dataset ds = databasegateway.getrecordings(); recordingselect.datasource = ds; recordingselect.datatextfield = "title"; recordingselect.datavaluefield = "id"; recordingselect.databind(); } } void submitbtn_click(object sender, eventargs e) { dataset ds = databasegateway.gettracks( (string)recordingselect.selecteditem.value); mydatagrid.datasource = ds; mydatagrid.databind(); } #region web form designer generated code override protected void oninit(eventargs e) { // // codegen: 此挪用是 asp.net web 窗体安排器所必定的。 // initializecomponent(); base.oninit(e); } /// <summary> /// 安排器扶助所必定的本领 - 不要运用代码编纂器窜改 /// 此本领的实质。 /// </summary> private void initializecomponent() { this.submit.click += new system.eventhandler(this.submitbtn_click); this.load += new system.eventhandler(this.page_load); } #endregion}之上示例大略的说领会asp.net的mvc实行,在本质名目中,商务论理远远不只如许,然而上述的代码展示了一个基础的模子,在减少了代码和搀杂度的同声也带来了不言而喻的长处,如:模块依附的贬低、代码反复的缩小、工作和题目的辨别、代码的可尝试性之类。到此刻您能否确定了运用model-view-controller (mvc)形式来将动静web运用步调的用户界面组件与交易论理分割飞来,要建立的运用步调将以动静办法结构网页,然而暂时的页面导航都是鉴于静态导航的情势。在越发搀杂的运用体例中,怎样商量尽大概制止导航代码的反复,以至商量鉴于可摆设的准则来动静决定页面导航,那么page controller和front controller那种意旨来说是对于mvc形式在越发搀杂的体例的优化。平淡搀杂水平的优化—page controller(页面遏制器)运用page controller形式接收来自页面乞求的输出、挪用乞求对模子实行的操纵以及决定运用于截止页面包车型的士精确视图。分割安排论理和一切视图关系代码。即使符合,创造用来一切页面遏制器的公用基类,以制止代码反复并普及普遍性和可尝试性。图5表露了页面遏制器与模子和视图的联系。页面遏制器可接受页面乞求、索取一切关系数据、挪用对模子的一切革新以及向视图转发乞求。而视图又将按照该模子检索取表露的数据。设置独力页面遏制器将分割模子与web乞求详细(比方对话处置,或运用查问字符串或湮没表单域向页面传播参数)。依照这种基础情势,为web运用步调中的每个链接创造遏制器。遏制器所以将变得特殊大略,由于历次仅须商量一个操纵。为每个网页(或操纵)创造独力遏制器大概会引导洪量代码反复。所以该当创造basecontroller类以兼并考证参数(请参见图6)等公用因变量。每个独力页面遏制器都不妨从basecontroller接受此公用工能。除去从公用基类接受除外,还不妨设置一组扶助器类,遏制器不妨挪用那些类来实行公用工能。大普遍情景下,页面遏制器在于于鉴于http的web乞求的简直详细。所以,页面遏制器代码常常包括对http头、查问字符串、表单域、多局部表单乞求等的援用。所以在web运用步调框架除外尝试遏制器代码特殊艰巨。独一本领是经过模仿http乞求和领会截止来尝试遏制器。这种典型的尝试既费时且易堕落。所以,要普及可尝试性,不妨将依附web的代码和不依附web的代码辨别放入两个独立类中(请参见图7),这是page controller的变体实行。page controller是大普遍动静web运用步调的默许实行办法,它大略,web运用框架内置,可扩充性及其开拓职员负担的分割之类便宜使其在web开拓获得普遍的运用,然而每页面一遏制器、较深的接受树和对于web框架的依附之类也是其比拟鲜明的控制。莫大搀杂的优化—front controller(前者遏制器)front controller经过让单个遏制器控制传输一切乞求,进而处置了在page controller中生存的分别化题目。遏制器自己常常分为以次两局部实行:处置步调和吩咐档次构造(见图8)。处置步调具备以次两项工作:1) 检索参数。处置步调接受来自web效劳器的http post或get乞求,并从乞求中检索关系参数。2) 采用吩咐。处置步调开始运用乞求中的参数采用精确的吩咐,而后将遏制权变化给该吩咐再不实行处置。在前者遏制器中,一切乞求都经过单个(常常是两元件)遏制器来传递。遏制器的第一个元件是处置步调,第二个元件是commands(吩咐)[gof95]的档次。吩咐自己是遏制器的一局部,代办遏制器触发的一定操纵。在实行该操纵之后,吩咐采用要运用哪个视图来表露页面。常常,建立的此遏制器框架运用摆设文献将乞求映照到操纵,所以,它在建立之后便于变动。固然,其缺陷在乎这种安排固有的搀杂水平。脱漏之后的弥补到暂时为止,仍旧完备地展现了web表白形式中mvc的实行框架结构,同声在此本领上对于平淡搀杂和莫大搀杂的情景提出了page controller和front controller动作优化的本领,在建立web表白的运用步调,仍旧给出了对立完备的处置计划,经心的读者群能否创造,是否还少了一点什么?在建立web运用步调的功夫,除去建立一个“良构”的体例(这表此刻mvc的辨别和体例的可扩充),咱们还须要商量运用步调的安定和本能,所以咱们采用了interceptiing filter和page cache动作web表白形式的弥补实质。intercepting filter(挑选器)怎样环绕web页面乞求来实行大众的预处置和后处置办法?这是挑选器须要处置的题目,运用此形式,您创造一串可拉拢的挑选器,再不在web页面乞求功夫实行大众的预处置和后处置工作。挑选器形成了一系列独力模块,在将页面乞求传播到遏制器东西之前,那些模块不妨链接在一道以实行一组大众的处置办法。由于各个挑选器实行的是实足沟通的接口,以是它们相互之间没有显式依附性。所以,不妨在不会感化现有挑选器的情景下增添新的挑选器。您以至不妨在安置时增添挑选器,本领是鉴于摆设文献动静地对它们举行范例化。对各个挑选器的安排该当尽大概让它们不对能否生存其余挑选器作出任何假如。如许不妨保护可拉拢性,即增添、简略或从新陈设挑选器的本领。其余,某些实行intercepting filter形式的框架不会保护挑选器的实行程序。即使创造多个挑选器之间生存很强的彼此依附性,最佳采用挪用扶助器类的惯例本领,由于如许不妨保护保持挑选器序列中的牵制消息。intercepting filter的径直实行办法是一个挑选器链,这个挑选器链不妨用来遍历一个由一切挑选器构成的列表。web乞求处置步调在将遏制权传播到运用步调论理之前将开始实行挑选器链。当web效劳器收到页面乞求时,乞求处置步调开始将遏制权传播给filterchain(挑选器链)东西。此东西保护着一个包括一切挑选器的列表,并按程序挪用每个挑选器。filterchain不妨从摆设文献中读取挑选器程序,以实行安置时的可拉拢性。每个挑选器都有时机窜改传入乞求。比方,它不妨窜改url,或增添运用步调要运用的头字段。实行完一切挑选器之后,"乞求处置步调"将遏制权传播给遏制器,后者将实行运用步调功效(见图12)。由于在处置web乞求时常常须要有截取挑选器,以是大普遍web框架都为运用步调开拓职员供给了将截取挑选器挂靠到乞求-相应进程中的体制。page cache(页面缓存)]即使动静天生的web页被一再乞求而且建立时须要耗用洪量的体例资源,那么,怎样本领矫正这类网页的相应功夫?页面缓存经过对从动静网页天生的实质举行缓存来普及乞求相应的含糊量。默许情景下,在asp.net中扶助页面缓存,但只有设置灵验的过时战略,要不,不会对来自任何给定相应的输入举行缓存。要设置过时战略,不妨运用初级outputcache api或高档@outputcache训令。页面缓存的基础构造是对立大略的。web效劳器保护包括预先天生的页面包车型的士当地数据保存(见图13)。底下的序列图阐领会页面缓存不妨矫正本能的因为。第一个序列图(见图2)刻画尚未缓存所需页面包车型的士初始状况(即所谓的缓存未掷中)。在这种情景下,web效劳器必需考察数据库,并天生html页,再将其保存在缓存中,而后将它归来给存户端欣赏器。请提防,此进程比不举行缓存的情景稍慢,由于它实行了下列特殊办法:1. 决定页面能否已缓存2. 将页面变换为html代码,而后保存在缓存中与数据库考察和html天生比拟,个中的任一办法都不该当耗费很长功夫。然而,由于在此情景下须要举行特殊处置,以是您必需保证在体例实行与缓存未掷中关系的办法之后贯串屡次掷中缓存(如图14所示)。在图15所示的缓存掷中情景下,页面仍旧居于缓存中。经过跳过数据库考察、页面天生和页面保存,缓存掷中俭朴了轮回。在asp.net中不妨沿用下述三种形式来实行缓存战略:1.将<%@ outputcache duration="60" varybyparam="none" %>如许的训令插入到要缓存的每个页面中。训令指定革新间隙(以秒为单元)。革新间隙不依附于外部事变,并且缓存不许十足革新。2.vary-by-parameter caching.此形式运用absolute expiration的变型,该变型使开拓职员不妨指定感化页面实质的参数。所以,缓存将保存页面包车型的士多个本子,并按参数值为那些页面本子体例索引。3.sliding expiration caching.此形式与absolute expiration(一致过时)的一致之处是,页面在指定的功夫内是灵验的。然而,在历次乞求时城市重置革新间隙。比方,您大概运用滑行过时缓存,将一个页面缓存最长10秒钟。只有对页面包车型的士乞求是在10秒钟内发出的,就将过时功夫再延迟10秒钟。中断语自此,咱们仍旧完备地引见了web表白集群中关系的各个形式,对于在mvc形式中observer(查看者)形式的用法,咱们会用特意的篇幅来引见,笔墨中提到的少许援用不妨在http://www.microsoft.com/china/msdn/architecture/patterns/espbiblio 找到对立精细的列表,固然,搜集即是您最佳的资源。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.