这篇文章描述了使用三种方法来实现或扩展一个通用服务协议(generic service contract),其中包括实现一个通用服务协议、扩展一个服务协议以及多头服务(Multi-Headed Service),这个实例中使用的通用的服务协议是在Service Tutorial 8 (C#) - Generic Service Declaration.所创建的。

这个实例由完成,能够鄙人面的目录中找到这个项目:

Samples"ServiceTutorials"Tutorial9"CSharp

创立项目

由于项目需求扩展一个通用服务协议(generic Service Contract),所以项目中需求引证Service Tutorial 8项目生成的dll文件,在Service Tutorial 9项目你会看到它完成了三个个服务,在一个项目中完成多个服务的话,要保证这些服务的命名空间是不同的哦。

第二步:完成一个通用服务协议

第一个服务实例是GenericServiceImplementation完成这个服务的文件是GenericServiceImplementation.csGenericServiceImplementationTypes.cs这个服务仅仅是完成了一个通用服务协议。

服务类型声明(Service Type Declarations):

由于在这个服务中运用了通用服务协议,因而它不需求咱们去界说他的状况和操作,这些在通用服务协议现已界说好了,看看ServiceTutorial8就知道了,可是它仍是需求一个协议标识(Contract identifier),由于需求用这个标识来找到这个服务,服务标识界说如下:

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
12

引证通用协议(Referencing the Generic Contract

在项目中引证通用服务协议署理程序集(generic contract's proxy assembly),一定要引证署理程序集,即*Proxy.dll,这个文件能够在msrs装置根目录下的bin文件夹中找到,为这个通用服务协议的命名空间界说一个别号,如下:

using generic = ServiceTutorial8.Proxy;

服务完成

这个服务的完成和其他的服务根本没有什么区别,有两点如下:

1、服务完成类需求用AlternateContract特点符号,用来指示在这个服务中运用的是通用服务协议。

1///
2///Thisserviceprovidesanimplementationofthegenericservice
3///
4[Contract(Contract.Identifier)]
5[AlternateContract(generic.Contract.Identifier)]
6[DisplayName("ServiceTutorial9:GenericServiceImplementation")]
7[Description("ThisserviceimplementsthegenericserviceprovidedinServiceTutorial8.")]
8[DssServiceDescription("http://msdn.microsoft.com/library/bb727257.aspx")]
9publicclassImplementationService:DsspServiceBase
10

2、由于这个服务自己没有界说状况和操作,状况和操作都在通用服务协议有所界说了,只需在服务中运用算了。如下:

1//Thestateofthisserviceisexactlythatofthegenericservice
2[ServiceState]
3privategeneric.GenericState_state=newgeneric.GenericState();
4
5//Theoperationsportisexactlythatofthegenericservice
6[ServicePort("/GenericServiceImplementation",AllowMultipleInstances=false)]
7privategeneric.GenericServiceOperations_mainPort=newgeneric.GenericServiceOperations();
8
9///
10///DefaultServiceConstructor
11///
12publicImplementationService(DsspServiceCreationPortcreationPort)
13:
14base(creationPort)
15{
16}
17

剩余的作业是为通用协议中的界说的音讯操作(message operations)增加处理办法(handler),如下代码界说了Get操作的处理办法:

1///GetHandler
2///
3///
4///
5//NotethatthisservicedoesnotneedtoimplementGetunlessthereare
6//somespecificfunctionsthatitmustperform
7[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
8
9publicvirtualIEnumerator<ITask>GetHandler(generic.Getget)
10{
11get.ResponsePort.Post(_state);
12yieldbreak;
13}
14

运转服务

运转服务后,在浏览器中Service Directory能够查看到两个服务genericServiceimplementationgenericserviceimplementation/servicetutorial8.由于服务没有扩展通用服务协议,所以这两个服务的状况和操作是相同的。

MRS完成和扩展一个Service Contract(mrs后加什么)  Microsoft Robotics S Service Contract 扩展 第1张

图1,运转服务,如图红框标出DSS节点中运转了两个服务(genericserviceimplementation and genericserviceimplementation/servicetutorial8),两个服务有相同的状况和操作类型。

第三步:扩展一个通用服务协议

第二个服务供给了对通用服务协议的完成,一起又增加了一个自己的状况和音讯操作,这样做的意图是:假设服务运用者只知道通用服务协议所界说状况和操作的话,他能够很简单运用这个服务,而且,这个服务还答应运用者运用扩展的状况和操作。

服务类型声明

和前面完成的服务不同,前面的服务没有自己的服务类型声明,而这个服务有自己服务类型声明,包含协议标识,服务状况以及服务操作,其间服务状况承继自通用服务中的状况。

协议标识声明如下:

1///
2///GenericServiceExtensionContractIdentifier
3//////
4publicstaticclassContract
5{
6publicconststringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/extension.html";
7}
8

其间的服务状况承继自通用服务协议中的状况,一起有所扩展,增加了Age特点,承继完成如下:

  

1[DataContract]
2[DisplayName("ServiceTutorial9:ExtensionServiceState")]
3[Description("ThisservicestateextendsthegenericservicestateprovidedinServiceTutorial8.")]
4publicclassExtensionState:generic.GenericState
5{
6int_age;
7[DataMember]
8[DisplayName("Age")]
9[Description("Specifiestheageofaperson.")]
10publicintAge
11{
12get{return_age;}
13set{_age=value;}
14}
15
16

除了增加了新的特点,又增加了结构函数,这个结构函数经过一个基类的实例来初始化子类目标,
更有意思的是,又增加了个类型转化办法,这个办法将子类转化为父类,这样做的原因是,
1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
120
1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
121
1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
122

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
123

这个实例中咱们又增加了一个音讯操作类型,即UpdateAge操作,假设咱们没有扩展服务状况而仅仅增加一个操作,咱们能够重用通用服务协议界说的音讯操作类,可是这儿咱们只能从头界说一个服务操作。

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
124

服务完成

和前面的服务的完成办法不相同,前面服务彻底运用通用服务的协议中界说的状况和操作,而这个服务的状况和主端口都运用的扩展的状况和操作,由于主端口运用的是扩展的操作类型,所以它并不能处理从备用端口传来的音讯,因而,和前面服务不同的是,咱们还需求声明另一个端口用来处理通用服务协议中界说的操作,这个端口即备用端口(AlternateServicePort),在对端口的声明上和前面的服务有所不同,前面的服务在类(ExtensionService层次上运用AlternateContract特点,这儿咱们用AlternateServicePort特点来符号备用端口,代码如下:

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
126

留意:

AlternateContractAlternateServicePort是不能一起运用的哦,当你将通用服务协议所界说的操作类用作主端口时,那么运用AlternateContract特点来符号这个服务,而假设你没有将通用服务协议界说的操作类作为主端口,而是将它作为备用端口,那就要在端口声明时为其符号AlternateServicePort特点。

剩余的事便是为音讯界说处理办法,由于这个服务中有两个端口,每个端口都有自己的音讯类型,即主端口和备用端口各自接纳自己所界说的音讯,代码如下:

这段是处理主端口传来的音讯:

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
127

这段是处理从备用端口传来的音讯的代码,这儿运用了服务状况中所界说的类型转化办法ToGenericState,从子类目标中抽离出了父类目标,这样的优点是,提高了这个服务的通用性,由于父类目标是在通用服务协议中界说的,是咱们所共知的,是标准,和其他服务交互的时分通常是传递的这个通用的状况目标的哦,彼此之间耦合就降了下来,这和面向目标中的多态相似哦。

一起要留意这些处理办法的特点中多了一个参数PortFieldName,这个参数用来告知DSS运转时环境将这个处理办法附加到姓名为_altPort的备用端口(Alternate Port)上。

没有运用这个参数的处理办法会被DSS环境会附加到主端口(Service Port)。

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
128

运转服务

运转服务后,从服务目录相同能够看到两个服务(genericserviceextension and genericserviceextension/servicetutorial8)可是和前面完成通用协议的服务不同,这两个服务有不同的状况。

MRS完成和扩展一个Service Contract(mrs后加什么)  Microsoft Robotics S Service Contract 扩展 第2张

图2-运转服务后在目录中呈现两个服务(genericserviceextension and genericserviceextension/servicetutorial8)这两个服有不同的状况和操作,包含相同的状况实例。

第一个服务(genericserviceextension)包含了扩展的状况和操作,第二个服务(genericserviceextension/servicetutorial8)包含通用的状况和操作。

MRS完成和扩展一个Service Contract(mrs后加什么)  Microsoft Robotics S Service Contract 扩展 第3张

图3-第二个服务(genericserviceextension/servicetutorial8)包含通用的状况和操作,这样其他的服务能够把这个服务视为通用服务而与之通讯了。

第四步:完成一个多例服务(multi-headed service

最终一个服务实例在(MultiFunctionService.cs and MultiFunctionServiceTypes.cs)界说,MSDN中称它为(multi-headed service),咱们称他为多例服务,即在一个服务中完成多个状况和端口,端口之间是彼此独立并行履行,就好像一个服务中包含了多个独立的服务实例,从外部看来,这些服务都是彼此独立的,他们或许同享了一个资源或许彼此之间有比较高的耦合度,当开发多例服务时,仍是需求考虑下把这些服务分隔来完成是不是更好呢?由于分隔完成会有更大的灵活性。

多例服务的完成和前面所说的服务完成办法是相同的,他或许会有多个操作端口,一个主端口(main port),其他的是备用端口(alternate port),而且还要为这些端口别离完成音讯处理办法。

和前面服务不同的是,多例服务包含多个状况目标实例,这些状况实例看起来并不相关。

1///
2///GenericServiceImplementationContractIdentifier
3///
4publicsealedclassContract
5
6{
7///TheUniqueContractIdentifierforthisservice
8
9[DataMember()]
10publicconstStringIdentifier="http://schemas.tempuri.org/2007/08/servicetutorial9/genericservice/implementation.html";
11}
129
转载请说明出处
知优网 » MRS完成和扩展一个Service Contract(mrs后加什么)

发表评论

您需要后才能发表评论