蒙在股里 发表于 2015-1-18 11:19:59

ASP.NET网页编程之乐成完成依附注进仓酷云

它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。我在写《DependencyInjectionin.NET》时常常碰着的一个反响是“你怎样把依附注进写成一整本书?”这类难以相信的反响是很天然的,假如你以为依附注进的次要形式(机关函数注进)十分简单了解。
固然这个次要形式易于了解,却很难乐成完成依附注进,由于这个机制只是一个更年夜的高低文里的一部分。DI是对把持反转(IoC)准绳的使用,想要乐成完成IoC,你就要把你的头脑逆转过去。这篇文章勾勒了乐成完成DI所需的心智模子。
松懈耦合:依附注进vs.服务定位器

假如你不睬解DI的目标,就很简单把它完成错。这是我比来看到的一个例子:
privatereadonlyILoglog;
publicMyConsumer(ILoglog)
{
this.log=log??LogManager.GetLogger("My");
}
从封装的角度来看,这个计划的次要成绩是MyConsumer类仿佛没法断定它是不是对日记程序这个依附的创立具有把持权。固然这个示例很复杂,但假如LogManager前往的ILog实例包装了一个非托管资本,必要在不利用的时分开释失落,那就有大概演化成一个成绩。
如许的完成之以是会呈现,是由于开辟者把全体精神放在让MyConsumer能够举行单位测试。如许做的来由是开辟者只想在单位测试的时分能够交换ILog,别的情形应当利用LogManager前往的实例。
这实践上就是BastardInjection反形式。个中一个潜伏成绩是它很简单违背里氏代换准绳,由于某个特定的完成失掉了特别看待。
DI(DependencyInjection,依附注进)的目标比起纯真地帮忙举行单位测试要普遍的多。它的目标是完成松懈耦合,以便提拔全部办理计划的可保护性。(假如你想晓得为何松懈耦合可以增添可保护性,我的书的第一章会商了这个话题,你能够收费下载试读。)
松懈耦合可被概述为基于接口而不是详细完成举行编程的头脑。可是,由于接口没有机关函数,怎样创立那些接口的实例即刻就成了一个成绩。
依据你的编程体例,有两种完整分歧的计划能够猎取接口的实例:

关于后面的示例,很简单就会演化成服务定位器(ServiceLocator)反形式,像如许:
publicMyConsumer(){this.log=Locator.Resolve<ILog>();}除服务定位器的别的成绩,这类计划的成绩还在于LogManager.GetLogger("My")办法挪用所需的参数丧失了。假定别的consumer对象必要的日记程序是经由过程分歧的参数实例化的,那末这个版本的服务定位器就没法事情了。
这一般会招致定位器的Resolve办法有一个或多个重载版本,以便向服务定位器供应高低文信息。如许,离违背里氏代换准绳就不远了。
DI供应了一个更好的计划:
privatereadonlyILoglog;publicMyConsumer(ILoglog){if(log==null)thrownewArgumentNullException("log");this.log=log;}这是把持反转的地道情势。ILog的任何完成都能承受,同时经由过程前提语句包管这个实例不为null。这跟利用服务定位器相反,高低文没有在构建对象图的时分丧失。
varconsumer=newMyConsumer(LogManager.GetLogger("My"));在创立MyConsumer的实例时,卖力创立的代码晓得这个特定的consumer对象利用哪一个完成ILog接口的类,因而能够依据高低文供应准确的完成。
DI和服务定位器是完成松懈耦合的两种互斥计划。手艺上,两种都是可行的,但DI没有服务定位器的弱点。
DI的独一弱点是它不像服务定位器那样易于了解。想要乐成完成DI,你必要克制一些停滞。
通往依附注进的坎坷之路

进修DI的个中一个应战,也是你起首碰着的最难的成绩:怎样猎取一个接口的实例?好动静是一旦你了解机关函数注进只是复杂地经由过程机关函数哀求一个实例,你就超过了这个最困难的停滞。
接上去的应战对照简单办理,今后一个加倍简单。我喜好把这些应战设想成你必要攀越的山。第一个又高又陡,但下一个会对照简单,从那以后很快就会变得平展:

在乐成完成DI的路上,你的第一个停滞是了解经由过程机关函数注进把构建consumer对象及其依附的义务托付给第三方。这个第三方就是对象组合的根(CompositionRoot),它是使用程序里的一个自力的点,全部对象图都是在这里构建的。由于对象组合的根卖力构建全部对象图,以是它把握了全部高低文,这使它能够对谁依附谁这个成绩做出明智的决意。
这大概吓跑了一些开辟者,由于他们惧怕这会招致功能成绩,但现实并不是云云。
关于年夜多半人来讲,第二个停滞多是某个依附切实其实定必要一个运转时的值。这类情形一般产生在某个依附要等用户在用户界面上做出特定的选择时才干断定。关于这类情形,笼统工场一般是一个办理计划。
依据我的履历,开始的两个停滞是最难克制的。别的应战也会呈现,但一样平常都是一般征象。在我的书的第六章里,我搜集了人们大概碰着的罕见成绩,和办理它们的举措。
不论如何,一旦你对DI构成了准确的心智模子,任何应战都能容易办理的。
关于作者

MarkSeemann是AutoFixture的创作者,也是《DependencyInjectionin.NET》的作者。他是一个专业的软件开辟者和架构师,他住在丹麦的哥本哈根,今朝是一家丹麦征询公司Commentor的软件架构师。他喜好浏览、画画、弹吉他、好酒和美食。
检察英文原文:SucceedingwithDependencyInjection
因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如net网页编程改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。

飘飘悠悠 发表于 2015-1-20 20:38:59

虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。

不帅 发表于 2015-1-25 23:07:30

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。

第二个灵魂 发表于 2015-1-26 23:08:22

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

再现理想 发表于 2015-1-31 20:47:38

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

深爱那片海 发表于 2015-2-4 21:16:25

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

只想知道 发表于 2015-2-9 05:33:12

ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。

兰色精灵 发表于 2015-2-27 00:56:01

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

活着的死人 发表于 2015-3-8 11:50:58

Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。

透明 发表于 2015-3-10 02:05:29

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

谁可相欹 发表于 2015-3-12 16:46:34

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

小魔女 发表于 2015-3-20 00:39:32

ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
页: [1]
查看完整版本: ASP.NET网页编程之乐成完成依附注进仓酷云