Factory Pattern在.Net Remoting Architecture中的实现
2005-08-22 15:48
267 查看
FactoryPattern在.NetRemotingArchitecture中的实现 | |||
混合法混合法需要使用RecordingsFactorySAO,它提供了创建RecordingsManagerCAO的方法。(如果您不熟悉SAO示例,请参阅"使用服务器激活对象通过.NETRemoting实现Broker"。)下面的类图表描述了总体解决方案。usingSystem; usingSystem.Data; publicinterfaceIRecordingsManager { DataSetGetRecordings(); }IRecordingsFactory.cs以下示例显示了IRecordingsFactory接口: usingSystem; publicinterfaceIRecordingsFactory { IRecordingsManagerCreate(); }这些对象的服务器实现(RecordingsFactory和RecordingsManager)非常简单,并且包含在它们自己的、名为Server的程序集中。RecordingsFactory.cs该类扩展了MarshalByRefObject,并实现了IRecordingsFactory接口: usingSystem; publicclassRecordingsFactory:MarshalByRefObject,IRecordingsFactory { publicIRecordingsManagerCreate() { returnnewRecordingsManager(); } }RecordingsFactory对象是服务器激活对象。该实现只是对RecordingsManager类型调用new。该RecordingsManager对象是在服务器上创建的,并且,不是作为RecordingsManager对象、而是作为IRecordingsManager接口返回的。利用这种机制,客户端就可以依赖于接口而不是实现。RecordingsManager.csRecordingsManager类所需要的唯一更改是,它现在实现的是IRecordingsManager接口。 usingSystem; usingSystem.Reflection; usingSystem.Data; usingSystem.Data.SqlClient; publicclassRecordingsManager:MarshalByRefObject,IRecordingsManager { publicDataSetGetRecordings() { Console.WriteLine("Assembly:{0}-fillingarequest", Assembly.GetEntryAssembly().GetName().Name); StringselectCmd="select*fromRecording"; SqlConnectionmyConnection=newSqlConnection( "server=(local);database=recordings;Trusted_Connection=yes"); SqlDataAdaptermyCommand= newSqlDataAdapter(selectCmd,myConnection); DataSetds=newDataSet(); myCommand.Fill(ds,"Recording"); returnds; } }HttpServer.cs混合法中的服务器初始化代码用于为服务器激活的RecordingsFactory对象配置远程处理框架。激活方式与所使用的通道和协议无关,因此与以前一样(端口8100上的HTTP协议)。 usingSystem; usingSystem.Runtime.Remoting; usingSystem.Runtime.Remoting.Channels; usingSystem.Runtime.Remoting.Channels.Http; publicclassHttpServer { staticvoidMain(string[]args) { HttpChannelchannel=newHttpChannel(8100); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType( typeof(RecordingsFactory), "RecordingsFactory.soap", WellKnownObjectMode.Singleton); Console.ReadLine(); } }在该代码中,RecordingsFactory类型与URL usingSystem; usingSystem.Data; usingSystem.Runtime.Remoting; usingSystem.Runtime.Remoting.Channels; usingSystem.Runtime.Remoting.Channels.Http; publicclassHttpClient { [STAThread] staticvoidMain(string[]args) { HttpChannelchannel=newHttpChannel(); ChannelServices.RegisterChannel(channel); IRecordingsFactoryfactory=(IRecordingsFactory) Activator.GetObject(typeof(IRecordingsFactory), "http://localhost:8100/RecordingsFactory.soap"); Console.WriteLine("Client.main():Factoryacquired"); IRecordingsManagermgr=factory.Create(); DataSetds=mgr.GetRecordings(); Console.WriteLine("RecordingsCount:{0}", ds.Tables["recording"].Rows.Count); } } | |||
| |||
|
远程对象的激活方式 | |||
2、远程对象的激活方式在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象,称为对象的激活。在Remoting中,远程对象的激活分为两大类:服务器端激活和客户端激活。(1)服务器端激活,又叫做WellKnow方式,很多又翻译为知名对象。为什么称为知名对象激活模式呢?是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象,并根据指定的端口或地址来发布对象。.NetRemoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。如果熟悉Asp.Net的状态管理,我们可以认为它是一种Application状态。SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp.Net的状态管理,认为它是一种Session状态。(2)客户端激活。与WellKnown模式不同,Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。(1)SingleTon模式对于WellKnown对象,可以通过静态方法RemotingConfiguration.RegisterWellKnownServiceType()来实现:RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerRemoteObject.ServerObject),"ServiceMessage",WellKnownObjectMode.SingleTon);(2)SingleCall模式注册对象的方法基本上和SingleTon模式相同,只需要将枚举参数WellKnownObjectMode改为SingleCall就可以了。RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerRemoteObject.ServerObject),"ServiceMessage",WellKnownObjectMode.SingleCall);(3)客户端激活模式对于客户端激活模式,使用的方法又有不同,但区别不大,看了代码就一目了然。RemotingConfiguration.ApplicationName="ServiceMessage";RemotingConfiguration.RegisterActivatedServiceType(typeof(ServerRemoteObject.ServerObject));为什么要在注册对象方法前设置ApplicationName属性呢?其实这个属性就是该对象的URI。对于WellKnown模式,URI是放在RegisterWellKnownServiceType()方法的参数中,当然也可以拿出来专门对ApplicationName属性赋值。而RegisterActivatedServiceType()方法的重载中,没有ApplicationName的参数,所以必须分开。2、客户端获得远程对象。与服务器端相同,不同的激活模式决定了客户端的实现方式也将不同。不过这个区别仅仅是WellKnown激活模式和客户端激活模式之间的区别,而对于SingleTon和SingleCall模式,客户端的实现完全相同。(1)WellKnown激活模式要获得服务器端的知名远程对象,可通过Activator进程的GetObject()方法来获得:ServerRemoteObject.ServerObjectserverObj=(ServerRemoteObject.ServerObject)Activator.GetObject(typeof(ServerRemoteObject.ServerObject),"tcp://localhost:8080/ServiceMessage");首先以WellKnown模式激活,客户端获得对象的方法是使用GetObject()。其中参数第一个是远程对象的类型。第二个参数就是服务器端的uri。如果是http通道,自然是用 | |||
| |||
|
2005-7-26 | |||
NETWebservicesvs.remoting:Whichonewillworkbestforyourapp? | |||
MicrosofthasmadeatremendousamountofnoiseaboutbuildingapplicationswithWebservices,andits.NETFrameworksimplifiesthetaskofworkingwiththem.ButwhileWebservicesrepresentagreatwaytobuildapplications,theyareideallysuitedforclientsoutsidethefirewallcallingcomponentsonyourserverovertheInternet. | |||
| |||
|
Webservicesin.NET | |||
Webservices,calledXMLWebservicesbyMicrosoft,arethecomponentsthatareinstantiatedviaHTTP.Dataispassedto,andreceivedfrom,WebservicesusingHTTPandSOAP,whichiscleartextandbaseduponXML.ThankstoWebservices,passingdatabetweendifferentoperatingsystemsondifferentplatformshasbeensimplified.WebservicesuseHTTPtocommunicate,andthisrequiresaWebserver.RequestsmustbeturnedintoSOAPmessagesthataresenttotheWebserver.There,theyareprocessed,theobjectisinstantiated,themethodisexecuted,andthedataisplacedinanXMLformattobereturnedtotheclient.TheclientapplicationprocessestheXMLasnecessary.Giventhisscenario,itisnogreatsurprisethatWebservicesareslowwhencomparedtodirectbinaryaccessofobjects.WithoutWebservices,datadoesnothavetobeserializedtoXMLanddeserializedontheclient.RequestsandreturnsdonothavetoflowthroughaWebserver.Ofcourse,Webservicesdoofferadvantages.First,theycanbecalledbyalmostanyclient.Theclientdoesnothavetobea.NETapplication.Infact,theclientmachinedoesnotneedtoberunningaWindowsoperatingsystem.Second,becauseWebservicesuseSOAP,thedataflowsacrossfirewallseasily;alldataispassedasXML.Finally,asfaras.NETisconcerned,the.NETFrameworkmakesitincrediblyeasytocreateWebservices,andyoucandosowithjustafewlinesofcode. | |||
| |||
|
2005-7-25 | |||
BuildingDistributedApps?UseXMLWebServices,NotRemoting(Mostly) | |||
IfyouhavebeenwonderingwhethertouseXMLWebservicesor.NETRemoting,here'sasimpleanswer:UseXMLWebservicesmostofthetime.XMLWebservicesarethesameasmarshal-by-value.NETRemoting,butusingthemismucheasierthanusingRemotingfromscratch.Marshal-by-valueremoting(XMLWebservices)meansthatyougetXML-serializeddatafromyourremoteserver.Sometimes,youmayneeddynamiceventbehaviororyoumaynotwanttomovemassiveamountsofdataandneedalittlemorecontrol.Inthisinstance,youpeelbacktheXMLWebserviceslayerandstartbuildingdirectlyontopof.NETRemotingwithmarshal-by-referenceobjectsandeventsinks.Mostlynot,though.ThisarticlelooksatthebasictechnologiesthatsupportXMLWebservicesandprovidesabriefdemonstrationofhowtoproduceandconsumeWebservices.XMLWebServicesWillDoXMLWebservicesin.NETarebuiltontopof.NETRemoting.Forallintentsandpurposes,aWebserviceismarshal-by-value.NETRemoting.Therumormillalsosuggeststhat.NETRemotingmaybecompletelyconcealedbyXMLWebservicesinthefuture,makingadvancedfeaturesofRemotinglikeeventsinksavailableusingWebservices.IhopeyouaremorecomfortablewithXMLWebservices.Now,whenyouhavetochoosebetweenRemotingandWebservices,youarepreparedtomakeadecision.Mostofthetimewhenyoucreatedistributedapplications,XMLWebserviceswilldo. | |||
| |||
|
XMLWebservices.NETRemotingandSystem.NETCommunicationGuidelines | |||
1.AnXMLWebServicecallisessentiallyaSOAPmessagesentovertheHttpProtocol2..NETRemotingisacommunicationinfrastructurethatprovidesaccesstoremoteobjectsovertheTCPprotocol,Httpprotocolorsomeothercustomprotocol3.XMLWebServicesusesSOAP(SimpleObjectAccessProtocol)whichisanXMLmessagetocommunicateoverthewidelyusedHttpprotocol.4..NETRemotingprovidesobjectservicesovertheHttporTCPprotocol..NETRemotingcouldbeaSOAPmessageoveraHttpprotocol(similartoXMLWebservice)oraTCPprotocoloraBinaryFormattedmessageovertheTCPProtocolorHttpProtocol.5.WhenobjectsareremotedoveraTCPProtocolusingBinaryFormattingorEncodingyouhavethebestperformanceoverany.NETRemotingServiceorXMLWebservice.6.IfyouintendtosendSOAPmessagesovertheHttpprotocol,donotuse.NETRemoting,useXMLWebservices.ThemediumisthesameinbothinstancesandXMLWebservicesdelivermorespeedthan.NETRemotingserviceusingSOAPFormattingoveraHttpprotocol.7.UsingIISasaHostorserveroffersscalabilitytobothRemotedobjectsandXMLWebServices.XMLWebServicesuseIIS(InternetInformationServer)asaHostand.NETRemotingcanuseIIS,WindowsServices,WindowsForm,ConsoleApplicationasaHostorServer.8.YoucanbuildyourowninterprocesscommunicationsolutionusingclassesfromtheSystem.NETnamesapce.9.UsingIISasahostforXMLWebservicesor.NETRemotingserviceofferssecurityfeatureslikeauthenticationandalsostatemanagement.10.BinaryFormattingovertheTCPprotocolrequiresadditionalportsotherthatport80(whichIISuses)tobeopenedonyourwebserver.Theseadditionalportscouldposesecurityconsiderations.11.Using.NETRemotingofferssomeflexibilityfortheactivationofobjects(theycanbeactivatedontheserverorclient),objectlifetimemanagementusingleasesandobjectinstantiationmanagement(SingleCallorSingletonmodes.)12..NETRemotingoffersaccesstoaricherobjectorientedprogrammingmodelthan.XMLWebservices.13.XMLWebservicesoffersarichersetofoptionsforformattingSOAPmessagesthanSOAPFormattingina.NETRemotingContext.14.XMLWebservicesusesSOAPtocommunicatebetweentwocomputersandisbettersuitedforexchangingmessageswithapplicationsnotbuiltwith.NETwhile.NETRemotingisoptimizedforexchangingmessagesbetween.NETclients. | |||
| |||
|
设计.NET应用程序 |
升级到Microsoft.NETPaulD.SheriffPDSA,Inc.2002年4月出处:Microsoft摘要:本文概要介绍.NET应用程序中的各种典型物理结构之间的区别,这些结构已被证明是很有用的。针对每种结构介绍了其适用方案、实现方式和优缺点。本文同时介绍了两层、三层和N层应用程序。目标了解Microsoft?.NET应用程序的典型结构。了解在每种结构内进行开发的优缺点。前提条件熟悉.NET开发(包括Web开发和桌面开发)。熟悉编程概念(包括类和属性)。熟悉各种结构(包括多层和多服务器结构)。目录两层应用程序结构典型的两层应用程序是使用ADO.NET直接与数据库服务器(如MicrosoftSQLServer?)进行通信的客户端应用程序(参见图1)。除ADO.NET外,在客户端应用程序和数据库之间没有任何其他层。有关ADO.NET的详细信息,请参阅.NET框架文档、本系列的其他文章或使用MSDN搜索引擎。何时使用两层结构两层应用程序适用于没有或只有少量窗体的小型应用程序。对于使用本文中介绍的其他N层技术的应用程序,其原型也可算是两层应用程序。但是,两层应用程序不太适用于企业环境,因为开发和维护的时间及成本不好控制。典型的实现方式开发两层应用程序时可以采用多种技术。所有技术均使用ADO.NET、一个客户端界面(如桌面或基于Web的应用程序)和一个数据库(如SQLServer)。要使用两层应用程序结构,可以采用以下方式:使用数据绑定技术将ADO.NET数据集直接与控件连接。编写代码以访问ADO.NET对象,从而手动将数据加载到用户界面的控件中。使用上述两种技术的组合。使用上述任何技术直接在窗体上编写业务规则代码。优点两层应用程序具有以下优点:因为可以使用数据绑定将ADO.NET数据集直接与用于构建用户界面的很多控件连接,所以开发工作就变得简单而快捷。这有助于迅速建立并运行应用程序的基本功能。只需查看窗体便可以浏览应用程序的全部代码,而无须同时查看窗体和另一个组件。缺点两层应用程序开发方法具有以下缺点:所有业务规则均包含在前端代码中。因而,如果需要更改业务规则,则必须更新全部客户端。除非能够进行自动更新,否则这种维护工作将十分繁琐。当然,如果使用SQLServer,则可以将某些业务规则放到存储过程中,从而减少维护的时间和成本。尽管SQL可以在数据库结构和应用程序的其他部分之间提供某种程度的精简,但字段名称通常还是在源代码或控件属性中硬编码的。如果更改字段名称,则必须查找和替换应用程序中所有该字段的名称。如果使用了数据绑定,还必须检查所有窗体并更改属性。很多代码(如SQL语句和业务规则)常常在应用程序中重复出现,这是因为不同的窗体使用了某些相同的表。这使得此类应用程序的维护非常困难,因为如果需要更改表或字段的名称,则必须在多个位置进行更改,同时还需要在多个位置进行额外的回归测试。如果数据源发生变化,则对用于将数据加载到数据集的代码的更改将更加困难。例如,如果原来使用文本文件存储数据,然后又希望转换到SQLServer,其访问方式是截然不同的。此外,要将数据加载到应用程序的数据集,还有很多地方都需要更改代码。使用XMLWebService的三层应用程序另一种设计方式是使用XMLWebservice,将数据库的访问单独分给另一个组件,该组件将把数据返回到前端应用程序。图2显示了这种设计方式。有关使用XMLWebservices开发三层应用程序的详细信息,请使用MSDN搜索引擎。何时使用此技术使用XMLWebservice的三层应用程序适用于基于Web的应用程序或MicrosoftWindows?应用程序。如果需要桌面应用程序的丰富功能,而用户连接自多个不同的位置,并通过HTTP界面访问数据,则很适合使用此技术。典型的实现方式要创建三层/XMLWebservice应用程序,通常采用以下开发技术:所有SQL驻留在XMLWebservice中。在服务器上构建数据集,并将其作为XML流返回到客户端,它们在这里又可以重新被构建为数据集。可以将从XMLWebservice返回的数据集直接绑定到窗体的控件中。可以使用从XMLWebservice返回的数据集手动将数据加载到窗体的各种控件中。直接在窗体上编写所有业务规则的代码。优点使用XMLWebservice的三层应用程序具有以下优点:因为可以使用数据绑定将ADO.NET数据集直接与用于构建用户界面的很多控件连接,所以开发工作就变得简单而快捷。这有助于迅速建立并运行应用程序的基本功能。用户可以从能连接到Internet(或Intranet)的任何地方运行应用程序。数据库访问被单独分给自己的组件,这样就无需在前端代码中嵌入SQL。连接信息只保留在XMLWebservice上,同样减少了客户端计算机的维护工作。可以在某个中心位置更新数据库访问层。如果对此层进行简单的代码更改,则无需重新向客户端分发组件。缺点此设计的缺点与典型的两层应用程序的缺点基本相同,因为它并没有分离业务规则,而只是分离了数据层。此外,表中的列名称也没有被提取到类中(将在下一节中介绍)。所有业务规则均包含在前端代码中。因而,如果需要更改业务规则,则必须更新全部客户端。除非能够进行自动更新,否则这种维护工作将十分繁琐。当然,如果使用SQLServer,则可以将某些业务规则放到存储过程中,从而减少维护的时间和成本。所有字段名称均在源代码或控件属性中硬编码。如果更改字段名称,则必须查找和替换应用程序中所有该字段的名称。如果使用了数据绑定,还必须检查所有窗体并更改属性。通过HTTP界面进行访问比直接连接数据库要慢。如果用户无法访问Internet(或Intranet),则无法使用该应用程序。使用.NETRemoting的三层应用程序这种类型的应用程序结构与使用XMLWebservice的三层应用程序几乎完全相同。唯一的区别是使用.NETRemoting代替XMLWebservice来包装数据访问层。图3显示了这种设计方式。有关.NETRemoting的详细信息,请参阅本系列的其他文章或使用MSDN搜索引擎。何时使用三层.NETRemoting技术使用.NETRemoting的三层应用程序适用于必须在LAN中的计算机之间分布的应用程序。这可能是出于业务原因,或者考虑到所涉及的工作成本,采用网络呼叫比较合理。典型的实现方式要创建这种应用程序,通常采用以下开发技术:所有SQL驻留在通过Remoting服务调用的组件中。在服务器上构建数据集,并将其作为XML流返回到客户端,它们在这里又可以重新被构建为数据集。将从Remoting组件返回的数据集直接绑定到窗体的控件中。使用从Remoting组件返回的数据集手动将数据加载到窗体的不同控件中。直接在窗体上编写所有业务规则的代码。优点使用.NETRemoting的三层应用程序与使用XMLWebservice的三层应用程序具有相同的基本优点。因为可以使用数据绑定将ADO.NET数据集直接与用于创建用户界面的很多控件连接,所以编写三层应用程序就变得简单而快捷。这有助于迅速建立并运行应用程序的基本功能。用户可以从能连接到LAN或WAN的任何地方运行应用程序。数据库访问被单独分给另一个组件,这样就无需在前端代码中嵌入SQL。可以在某个中心位置更新数据库访问层。如果在此组件中进行简单的代码更改,则无需重新向客户端分发组件。缺点这种三层设计的缺点与使用XMLWebservice的三层设计的缺点相同。所有业务规则均包含在前端代码中。因而,如果需要更改业务规则,则必须更新全部客户端。除非能够进行自动更新,否则这种维护工作将十分繁琐。当然,如果使用SQLServer,则可以将某些业务规则放到存储过程中,从而减少维护的时间和成本。所有字段名称均在源代码或控件属性中硬编码。如果更改字段名称,则必须查找和替换应用程序中所有该字段的名称。如果使用了数据绑定,还必须检查所有窗体并更改属性。通过网络从一个组件向另一个组件传输数据比直接连接数据库要慢。在Intranet方案中,.NETRemoting的性能比XMLWebservice要好。而在Internet方案中,一般不使用.NETRemoting。建立这种应用程序比建立两层应用程序或使用XMLWebservice的应用程序要复杂一些。逻辑N层应用程序使用.NET创建应用程序的最好方法是将所有逻辑进程分为不同的类。在典型的业务应用程序中,这通常包含业务规则组件、数据层组件和使用这些组件的前端代码。图4显示了这一方法。有关设计N层应用程序的详细信息,请参阅本系列的其他文章或使用MSDN搜索引擎。何时使用N层结构逻辑N层开发策略适用于所有类型的应用程序。无论是小型、中型、大型应用程序,还是桌面或Web应用程序,效果都很好。典型的实现方式要创建这种应用程序,通常采用以下开发技术:使用Windows窗体或Web窗体创建前端用户界面。使用单独的类库项目创建业务规则组件。使用单独的类库项目创建数据层组件。此数据层使用类来包装对各个表的访问。应当使用类型化数据集;它们提供了灵活的数据集类,并且为表中的每个列提供了严格的类型检查功能。优点逻辑N层应用程序具有以下优点:将业务规则集中到易于创建、使用和重用的组件中,从而方便了开发和维护。提供了高级语言以开发业务规则,代替使用存储过程和有限的SQL语言来检查业务规则。将数据访问集中到组件中,从而减少了应用程序中的重复代码,每个需要访问特定表的窗体都使用相同的组件。如果使用类型化数据集,则可以使用智能感知功能来查询列名称,而不必记住它们。集中式数据访问例程有助于维护工作,因为对任何数据访问例程的更改都只需进行一次即可。可以随时将组件分离到不同的物理计算机上。这种灵活性使代码具有更好的可缩放性和集中性。缺点逻辑N层应用程序只有两个较大的缺点:开发时间稍长,因为必须构建单独的组件。需要跟踪的组件会多一些。这使其略显复杂,对于编程新手来说可能不太好理解。使用XMLWebService的N层应用程序图5显示了如何进行逻辑N层应用程序设计并将其分布于多台计算机的示例。在此图中,可以看到使用了XMLWebservice来访问数据层。类型化数据集通过HTTP层返回到业务规则层。然后,客户端应用程序可以将该数据集用于用户界面的数据显示。何时使用此技术如果需要桌面应用程序的丰富功能,而用户可能连接自很多远程位置,并且需要通过HTTP界面来获取数据,那么就可以采用这种N层XMLWebservice应用程序设计。将业务规则保留在客户端上有利于网络畅通,但如果这些规则更改频繁,则会增加一些维护更新工作。由于.NET可以复制新的DLL而无需注册,所以这些问题已经不象在以前的技术中那样严重。这种方案也适用于基于Web的应用程序,其中由一台Web服务器提供数据,而由另一台Web服务器上的Web应用程序显示此数据。典型的实现方式要创建这种应用程序,通常采用以下开发技术:这些技术与逻辑N层应用程序中的技术相同。使用Windows窗体或Web窗体创建前端用户界面。使用单独的类库项目创建业务规则组件。使用单独的类库项目创建数据层组件。此数据层使用类来包装对各个表的访问。应当使用类型化数据集;它们提供了灵活的数据集类,并且为表中的每个列提供了严格的类型检查功能。优点使用XMLWebservice的N层应用程序具有多个优点,其中很多与逻辑N层应用程序相同。将业务规则集中到易于创建、使用和重用的组件中,从而方便了开发和维护。提供了高级语言以开发业务规则,代替使用存储过程和有限的SQL语言来检查业务规则。将数据访问集中到组件中,从而减少了应用程序中的重复代码,每个需要访问特定表的窗体都使用相同的组件。如果使用类型化数据集,则可以使用智能感知功能来查询列名称,而不必记住它们。集中式数据访问例程有助于维护工作,因为对任何数据访问例程的更改都只需进行一次即可。可以随时将组件分离到不同的物理计算机上。这种灵活性使代码具有更好的可缩放性和集中性。其他优点:集中式数据访问层。其他优点:应用程序的可扩展性-可以添加Web领域以处理用户对数据库的请求的大量负载。其他优点:用户可以通过Internet进行连接,但仍从桌面或基于Web的应用程序访问数据。缺点使用XMLWebservice的N层应用程序开发方法也有一些缺点。其中大部分与使用逻辑N层应用程序开发方案的缺点相同。开发时间稍长,因为必须构建单独的组件。需要跟踪的组件会多一些。这使其略显复杂,对于编程新手来说可能不太好理解。如果XMLWebservice不能正常工作,该应用程序将无法使用。其他N层应用程序技术当然,可以采用很多不同的技术来创建N层应用程序。例如,可以使用.NETRemoting在客户端层和业务规则层之间进行通信,如图6所示。迁移VisualBasic6.0的N层应用程序程序员在以前版本的MicrosoftVisualBasic?中使用N层技术已经有很多年了。如果有现成的COM组件,则可以很容易地为这些组件上加上.NET包装。之后,便可以获得如图7所示的结构。有关在.NET中使用COM组件的详细信息,请参阅本系列的其他文章或使用图7:使用.NET可以方便地建立原有COM组件的接口 何时使用VisualBasic迁移技术如果具有大量的COM组件代码,并且这些组件已经包含了您的业务规则和数据访问例程,则适合使用这种技术。因为可以利用很多现有代码,从而降低进入.NET框架的成本。典型的实现方式要创建这种应用程序,通常采用以下开发技术:使用Windows窗体或Web窗体创建前端用户界面。设置对原有COMDLL的引用。Microsoft.NET自动为此DLL创建一个.NET包装,因此可以象对任何.NET组件那样访问其属性和方法。如果从该DLL中返回任何ADO记录集,则可以将它们转换为数据集,这是绑定到.NET控件的最简单的方法。优点在COM接口外加上.NET包装,可以在使用现有代码的同时充分利用.NET的新功能,从而缩短开发周期。缺点在.NET中使用COM包装具有以下缺点:其性能不如完全在.NET中编写的代码。可能需要额外的代码以将ADO记录集转换为ADO.NET数据集。小结在开发.NET应用程序时,可以采用的结构形式几乎是无限的。易于创建和维护的结构才是最好的。当然,还要考虑其他设计目标,包括可缩放性、可靠性和可管理性等。在MSDN中,您可以找到许多相关主题的白皮书。 |
2005-7-19 |
ADO.NET创建关联的范例 |
SqlConnectioncustConn=newSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind;");SqlDataAdaptercustDA=newSqlDataAdapter("SELECT*FROMCustomers",custConn);OleDbConnectionorderConn=newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+"DataSource=c:\\ProgramFiles\\MicrosoftOffice\\Office\\Samples\\northwind.mdb;");OleDbDataAdapterorderDA=newOleDbDataAdapter("SELECT*FROMOrders",orderConn);custConn.Open();orderConn.Open();DataSetcustDS=newDataSet();custDA.Fill(custDS,"Customers");orderDA.Fill(custDS,"Orders");custConn.Close();orderConn.Close();DataRelationcustOrderRel=custDS.Relations.Add("CustOrders",custDS.Tables["Customers"].Columns["CustomerID"],custDS.Tables["Orders"].Columns["CustomerID"]);foreach(DataRowpRowincustDS.Tables["Customers"].Rows){Console.WriteLine(pRow["CustomerID"]);foreach(DataRowcRowinpRow.GetChildRows(custOrderRel))Console.WriteLine("\t"+cRow["OrderID"]);} |
相关文章推荐
- 用WebORB实现flex + .net后台的Remoting
- .NETRemoting中的几个重要概念和实现方法
- .Net Remoting 事件回调 Client 函数方法完整实例: C# 实现控制台网络聊天室 (Console Remoting ChatRoom)
- WindowsService+.Net Remoting 实现分布式应用系统
- .Net Remoting Application Architecture
- 用WebORB实现flex + .net后台的Remoting
- .Net Remoting Architecture
- .Net Remoting安全性与实现
- .Net Remoting Application Architecture
- .NET Remoting Architecture
- 应用框架的设计与实现——.NET平台(4.2 Remoting 无配置文件)
- .Net Remoting Architecture
- 用WebORB实现flex + .net后台的Remoting
- .Net Remoting Architecture
- .Net Remoting(分离服务程序实现) - Part.3
- .Net Remoting与WCF实现Server与Client通讯比较
- .Net Remoting Architecture
- C# NetRemoting实现双向通信
- .Net Remoting Architecture
- .NET Remoting 实现分布式数据库查询