海妖 发表于 2015-1-16 14:20:29

来一篇关于NET的.net中Attribuge的具体使用(六)

前天傍晚我发表了《Java的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。.NETFramework拦阻机制的计划中,在客户端和工具之间,存在着多种动静吸收器,这些动静吸收器构成一个链表,客户真个挪用工具的历程和挪用前往实施拦阻,你能够定制本人的动静吸收器,把它们拔出了到链表中,来完成你对一个挪用的前处置和后处置。那末挪用拦阻是怎样构架大概说怎样完成的呢?

在.NET中有两种挪用,一种是跨使用域(AppDomain),一种是跨高低文情况(Context),两种挪用均经由过程两头的代办署理(proxy),代办署理被分为两个部分:通明代办署理和实践代办署理。通明代办署理表露同工具一样的大众出口点,当客户挪用通明代办署理的时分,通明代办署理把仓库中的帧转换为动静(上一节提到的完成IMessage接口的工具),动静中包括了办法称号和参数等属性集,然后把动静传送给实践代办署理,接下往分两种情形:在跨使用域的情形下,实践代办署理利用一个格局化器抵消息举行序列化,然后放进远程通道中;在跨高低文情况的情形下,实践代办署理不用晓得格局化器、通道和Context拦阻器,它只必要在向前传送动静之前对换用实施拦阻,然后它把动静传送给一个动静吸收器(完成IMessageSink的工具),每个吸收器都晓得本人的下一个吸收器,当它们抵消息举行处置以后(前处置),都将动静传送给下一个吸收器,一向到链表的最初一个吸收器,最初一个吸收器被称为仓库创立器,它把动静复原为仓库帧,然后挪用工具,当挪用办法了局前往的时分,仓库创立器把了局转换为动静,传回给挪用它的动静吸收器,因而动静沿着本来的链表往回传,每一个链表上的动静吸收器在回传动静之前都抵消息举行后处置。一向到链表的第一个吸收器,第一个吸收器把动静传回给实践代办署理,实践代办署理把动静传送给通明代办署理,后者把动静放回到客户真个仓库中。从下面的形貌我们看到穿越Context的动静不必要格局化,CLR利用一个外部的通道,叫做CrossContextChannel,这个工具也是一种动静吸收器。

有几种动静吸收器的范例,一个挪用拦阻能够在服务器端举行也能够在客户端举行,服务器端吸收器拦阻一切对服务器高低文情况中工具的挪用,同时作一些前处置和后处置。客户真个吸收器拦阻一切外出客户端高低文情况的挪用,同时也做一些前处置和后处置。服务器卖力服务器端吸收器的安装,拦阻对服务器端高低文情况会见的吸收器称为服务器高低文情况吸收器,那些拦阻挪用实践工具的吸收器是工具吸收器。经由过程客户安装的客户端吸收器称为客户端高低文情况承受器,经由过程工具安装的客户端吸收器则称为特使(Envoy)吸收器,特使吸收器仅拦阻那些和它相干的工具。客户真个最初一个吸收器和服务器真个第一个吸收器是CrossContextChannel范例的实例。分歧范例的吸收器构成分歧的段,每一个段的端点都装上称为闭幕器的吸收器,闭幕器起着把本段的动静传给下一个段的感化。在服务器高低文情况段的最初一个闭幕器是ServerContextTerminatorSink。假如你在闭幕器挪用NextSink,它将前往一个null,它们的举动就像是逝世端头,可是在它们外部保留有下一个吸收器工具的公有字段。

我们大抵先容了.NETFramework的工具挪用拦阻的完成机制,目标是让人人对这类机制有一个熟悉,如今是完成我们代码的时分了,经由过程代码的完成,你能够看到动静怎样被处置的历程。起首是为我们的程序界说一个吸收器CallTraceSink:
//TraceContext.cs
usingSystem;
usingSystem.Runtime.Remoting.Contexts;
usingSystem.Runtime.Remoting.Messaging;
usingSystem.Runtime.Remoting.Activation;

namespaceNiwalkerDemo
{
publicclassCallTraceSink:IMessageSink//完成IMessageSink
{
privateIMessageSinknextSink;//保留下一个吸收器

//在机关器中初始化下一个吸收器
publicCallTraceSink(IMessageSinknext)
{
nextSink=next;
}

//必需完成的IMessageSink接口属性
publicIMessageSinkNextSink
{
get
{
returnnextSink;
}
}

//完成IMessageSink的接口办法,当动静传送的时分,该办法被挪用
publicIMessageSyncProcessMessage(IMessagemsg)
{
//拦阻动静,做前处置
Preprocess(msg);
//传送动静给下一个吸收器
IMessageretMsg=nextSink.SyncProcessMessage(msg);
//挪用前往时举行拦阻,并举行后处置
Postprocess(msg,retMsg);
returnretMsg;
}

//IMessageSink接口办法,用于异步处置,我们不完成异步处置,以是复杂前往null,
//不论是同步仍是异步,这个办法都必要界说
publicIMessageCtrlAsyncProcessMessage(IMessagemsg,IMessageSinkreplySink)
{
returnnull;
}

//我们的前处置办法,用于反省库存,出于简化的目标,我们把反省库存和发送邮件都写在一同了,
//在实践的完成中,大概也必要把Inventory工具绑定到一个高低文情况,
//别的,能够将发送邮件计划为别的一个吸收器,然后经由过程NextSink举行安装
privatevoidPreprocess(IMessagemsg)
{
//反省是不是是办法挪用,我们只拦阻Order的Submit办法。
IMethodCallMessagecall=msgasIMethodCallMessage;

if(call==null)
return;

if(call.MethodName=="Submit")
{
stringproduct=call.GetArg(0).ToString();//猎取Submit办法的第一个参数
intqty=(int)call.GetArg(1);//猎取Submit办法的第二个参数

//挪用Inventory反省库存存量
if(newInventory().Checkout(product,qty))
Console.WriteLine("Orderavailible");
else
{
Console.WriteLine("Orderunvailible");
SendEmail();
}
}
}

//后处置办法,用于纪录定单提交信息,一样能够将纪录作为一个吸收器
//我们在这里处置,仅仅是为了演示
privatevoidPostprocess(IMessagemsg,IMessageretMsg)
{
IMethodCallMessagecall=msgasIMethodCallMessage;

if(call==null)
return;
Console.WriteLine("Logorderinformation");
}

privatevoidSendEmail()
{
Console.WriteLine("Sendemailtomanager");
}
}
...

接上去我们界说高低文情况的属性,高低文情况属性必需依据你要创立的吸收器范例来完成响应的接口,好比:假如创立的是服务器高低文情况吸收器,那末必需完成IContributeServerContextSink接口。

...
publicclassCallTraceProperty:IContextProperty,IContributeObjectSink
{
publicCallTraceProperty()
{
}

//IContributeObjectSink的接口办法,实例化动静吸收器
publicIMessageSinkGetObjectSink(MarshalByRefObjectobj,IMessageSinknext)
{
returnnewCallTraceSink(next);
}

//IContextProperty接口办法,假如该办法前往ture,在新的高低文情况中激活工具
publicboolIsNewContextOK(ContextnewCtx)
{
returntrue;
}

//IContextProperty接口办法,供应初级利用
publicvoidFreeze(ContextnewCtx)
{
}

//IContextProperty接口属性
publicstringName
{
get{return"OrderTrace";}
}
}
...


最初是ContextAttribute
...

publicclassCallTraceAttribute:ContextAttribute
{
publicCallTraceAttribute():base("CallTrace")
{
}

//重载ContextAttribute办法,创立一个高低文情况属性
publicoverridevoidGetPropertiesForNewContext(IConstructionCallMessagectorMsg)
{
ctorMsg.ContextProperties.Add(newCallTraceProperty());
}
}
}

为了看分明挪用Order工具的Submit办法怎样被拦阻,我们略微修正一下Order类,同时把它计划为ContextBoundObject的派生类:
//Inventory.cs

//Order.cs
usingSystem;

namespaceNiwalkerDemo
{

publicclassOrder:ContextBoundObject
{
...
publicvoidSubmit(stringproduct,intquantity)
{
this.product=product;
this.quantity=quantity;
}
...
}
}

客户端挪用代码:
...
publicclassAppMain
{
staticvoidMain()
{
Orderorder1=newOrder(100);
order1.Submit("Item1",150);

Orderorder2=newOrder(101);
order2.Submit("Item2",150);
}
}
...

运转了局标明了我们对Order的Sbumit乐成地举行了拦阻。必要申明的是,这里的代码仅仅是作为对ContextAttribute使用的演示,它是粗线条的。在详细的理论中,人人能够计划的更精巧。

(全文完)我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了?

乐观 发表于 2015-1-18 13:14:57

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的工具。

活着的死人 发表于 2015-1-18 13:14:57

主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。

若天明 发表于 2015-1-25 17:48:23

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

兰色精灵 发表于 2015-2-3 12:38:59

那么,ASP.Net有哪些改进呢?

不帅 发表于 2015-2-9 01:35:13

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

简单生活 发表于 2015-2-26 17:32:20

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

金色的骷髅 发表于 2015-3-8 16:28:31

平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。

谁可相欹 发表于 2015-3-22 21:10:37

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
页: [1]
查看完整版本: 来一篇关于NET的.net中Attribuge的具体使用(六)