NET网页编程之.NET中值得体验的精巧计划
在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。MEF(ManagedExtensibilityFramework)是.NETFramework4.0一个主要的库,VisualStudio2010CodeEditor的扩大撑持也是基于MEF构建的。MEF的方针是简化创立可扩大的使用程序,其中心类是ComposablePart,即具有组合才能的组件,每个称为ComposablePart(中文可为可组合构件,不外下文一向接纳英文来暗示,如许对照贴切)的组件能够组合(称为Import)别的组件的功效(别的组件经由过程声明Export供应功效)而且它也能够经由过程界说Export将其功效表露给别的组件。ComposablePart经由过程组件目次(ComposablePartCatalog)来搜刮发明必要的功效,组件目次能够是一个物理文件目次、收集存储等。每个ComposablePart还具有静态组合的才能,在需要的情形下能够从头组合功效。本文将接纳自底向上的思绪体验一下MEF的计划头脑。1、无空话MEF
MEF的中心是可组合组件ComposablePart,它由ComposablePartDefintion来形貌和创立。每个可组合组件经由过程界说ExportDefintion向别的组件供应功效,经由过程ImportDefinition援用别的组件的功效,经由过程Metadata来形貌组件本身的信息。在创立一个ComposablePart组件后,经由过程在组件目次(ComposableCatalog)搜刮必要的功效完成组件组合。
2、典范的MEF组合历程
(1)创立组件目次(如AssemblyCatalog)
(2)创立组合容器CompositionContainer,组件容器经由过程组件目次搜刮组件的界说
(3)创立一个组件
(4)从组件容器猎取别的组件功效的界说,然后实行婚配组合
示例代码以下:varcatalog=newAssemblyCatalog(Assembly.GetExecutingAssembly());//创立一个程序集目次,用于从一个程序集猎取一切的组件界说
varcontainer=newCompositionContainer(catalog);//创立一个组合容器
varcomposablePart=newMyComponent();
container.ComposeParts(composablePart);//实行组合,沉着器中猎取ExportDefinition并创立实例组合在一同
//composablePart组合完成以供利用
其道理以下图(来自mef.codeplex.com官方网站):
3MEF实质——组合基元
组合基元是对供应具有可扩大、可组合才能的组件的“实质”撑持,它处于MEF的最底层,是全部Framework的中心类,由6个类组成,以下图所示(该图来自MEF白皮书,白皮书有点笼统,不外看起来很过瘾,前面附上自己翻译的中文版)。
组合基元类的形貌以下:
(1)ComposablePart:便可组合组件,是组合基元的中心类。ExportDefinitions暗示该组件供应的功效的形貌;而ImportDefinitions则是对援用别的组件功效的束缚的形貌。Metadata是对组件本身的特别标识,当一个ComposablePart经由过程Import援用别的组件功效时,元数据大概作为满意援用功效的束缚的一个前提。
(2)ExportDefinition:界说ComposablePart向别的组件供应的功效,这个功效利用一个ContactName和Metadata来形貌。ContactName即便用这个功效的左券,Metadata用于进一步形貌这个功效。
(3)ImportDefinition:界说ComposablePart对别的组件供应的功效的援用,即援用了另外一个组件的Exports。ImportDefintion利用一个表达式来形貌束缚,它在Constraint这个属性界说,其范例为Expression>。这个表达式用于对一个ExportDefintion做婚配判断,其婚配办法以下:
以下是代码片断:varallExportDefs=…//从ComposablePartCatalog猎取一切ExportDefinition
varconstraintDelegate=Constraint.Compile();//编译成婚配函数的代办署理
varsatisfiedExportDefs=allExportDefs.FindAll(constraintDelegate);//利用婚配函数的代办署理来过滤一切的ExportDefs
(4)ComposableDefinition:即ComposablePart界说,是ComposablePart的工场,该类界说了一类ComposablePart援用的功效、表露的功效及其本身的元数据。援用的功效在ImportDefinitions中形貌,表露的功效经由过程ExportDefinitions形貌。而Metadata则是对组件本身的形貌,在MEF中一样平常用于在一个组件援用(Import)另外一个组件功效时,经由过程对另外一个组件的元数据举行婚配,从而来断定是不是要组合另外一个组件供应的功效。该类是ComposablePart的工场,供应了CreatePart办法。
(5)ComposablePartCatalog:可组合组件目次,用于发明组件,这些组件大概来自物理目次、收集存储等。
4、怎样利用MEF
在下面,我们形貌了MEF的中心——组合基元,组合基元听起来很复杂,很简单了解,可是想间接利用组合基元来编写一个ComposablePartDefinition却不是那末简单了,在MEF的完成,这些类都是一些笼统类,用于形貌全部可扩大框架的模子。我先不想申明白MEF究竟是怎样来利用组合基元,先看示例好了。4.1界说ComposablePartDefinition
MEF经由过程引进一个基于特征的编程模子来简化ComposablePart的界说,以下所示的MessageSender和Processor类均是ComposablePart界说。
以下是代码片断:publicclassMessageSender
{
publicvoidSend(stringmessage)
{
Console.WriteLine(message);
}
}
publicclassProcessor
{
publicActionMessageSender{get;set;}
publicvoidSend()
{
MessageSender("Processed");
}
}BR>
4.2、创立ComposablePart
以下是代码片断:varcatalog=newAssemblyCatalog(Assembly.GetExecutingAssembly());//创立一个程序集目次,用于从一个程序集猎取一切的组件界说
varassemblyCatalog=newAssemblyCatalog(Assembly.GetExecutingAssembly());//创立组件目次
varcontainer=newCompositionContainer(assemblyCatalog);//创立组合容器
varprocessorPart=newProcessor();
container.ComposeParts(processorPart);//实行组合
processorPart.Send();
Console.ReadLine();BR>
4.3、基于特征编程模子的实质
经由过程4.1和4.2的示例能够发明,MessageSender和Processor这两个范例就是ComposablePartDefintion的完成,在这两个范例,我们经由过程Export和Import(ImportMany)特征来界说表露的功效和援用的功效。CompositionContainer经由过程这两个类地点的程序集的组件目次来搜刮一切的可组合组件界说,然后在实行组应时使用这些界说创立Export工具,依据Import声明的束缚左券完成组件的组合。
在这个编程模子内里,它同意我们:(1)利用传统OOP的范例界说来界说一个ComposablePartDefinition,无庸置疑,这基础没有引进庞大的观点;(2)利用Export/Import/ImportMany等元数据来声明组合功效,十分的复杂且简单了解。
CompositionContainer将会在背景构建这个Part对应的ComposablePartDefinition和组件目次别的ComposablePartDefinition,在实行组应时,使用Definition创立实例实行组合。
5、MEFvsMAFvsUnity
在刚进修MEF时,常常会问一个成绩,那就是MEF和MAF如许的插件框架、和Unity如许的IoC框架究竟有甚么区分。MEF与MAF(ManagedAddinFramework)最年夜分歧在于:前者存眷利用十分复杂的体例来撑持具有很强天真性的可扩大撑持,后者存眷具有物理断绝、平安、多版本撑持的插件平台架构;MEF和Unity分歧在于:前者夸大组合,后者夸大依附注进。
6、MEF总结
MEF有3点让我十分的深入,起首是组合基元的计划,其次是基于特征的编程模子,最初是MEF的完成办法。
组合基元是可扩大撑持的实质,它看起来显得十分的复杂,但却有可以撑持壮大的功效才能而且不掉天真性。“小道至简”,不外,“简”的水平的确一视同仁,MEF的“简”其实让人信服得心悦诚服。这个Framework也是除ObjectBuilder以外让我十分喜好的框架,检察其代码真是让人非常愉快。天人之作啊!这帮人的立异才能太刁悍了!
基于特征的编程模子,同意我们利用“类的界说+特征声明”的体例来界说一个具有组合才能的组件,它使得我们基于MEF编写组件变得十分十分的复杂!这也让我再次体味到面向高低文编程办法的魅力~,前面我也会先容一下我本来做过的一个基于高低文头脑计划的FW,和MEF的思绪有点相似。
MEF在完成时,其顶层定名空间是System.ComponentModel.Composition,底下分别了AttributeModel、Diagnostics、Hosting、Primitives、ReflectionModel定名空间。MEF的顶层定名空间界说了我们利用最多的特征,底下定名空间分离用于界说特征模子、诊断撑持、MEF宿主、组合基元、反射模子,全体完成十分的明晰简便!看第一眼我就爱上这玩意了!
7、基于特征编程模子的另外一个示例
我本来计划了一个基于特征的智能体编程框架。起首,我来简便的形貌甚么是智能体。智能体就是软件代办署理人,用软件来摹拟人类的特征,包含智能性、自动性、社会性、感知性等。从完成角度来看,一个智能体就是一个绑定了线程、动静行列的工具,这个工具用线程来摹拟人类年夜脑,用动静行列来摹拟年夜脑影象体。当智能体收到一条动静时,其线程会接受来处置。依据上述形貌,人人一定以为利用OOP开辟智能体有点贫苦。OK,那上面来看看我是怎样利用高低文完成智能体的。
7.1利用特征来声明一个具有感知才能和自动性的“人”
以下是代码片断:
publicclassSomePerson
{
publicvirtualOpenTheDoor()
{
//开门,自动性办法
}
publicvirtualOnTemperatureChanged(SensibilityContextcontext)
{
//当感知到温度变更的呼应,感知性声明
}
}
7.2创立智能体
以下是代码片断:>varagentContainer=newAgentContainer();
varagent=agentContainer.Build();//在背景构建一个真实的智能体
agent.OpenTheDoor();//挪用OpenTheDoor办法,这个挪用终极会变化成动静发送给真实的智能体由其自己来实行,就像或人让另外一人往关门一样,终极将由吸收到动静的人往实行关门这个举措。BR>
AgentFramework具有和MEF相似的计划办法(固然我们的内功和Microsoft那帮妙手没得比了),经由过程“界说范例+声明智能体特征”来界说智能体,这类体例复杂、天真且可扩大性强!
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库) 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。 由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 我的意思是.net好用,从功能上来说比JAVA强还是很明显的。 关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
页:
[1]