MRS实现和扩展一个Service Contract

来源:转载

这个实例由实现,可以在下面的目录中找到这个项目:

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 /// Generic Service Implementation Contract Identifier
 3 /// 

 4 public sealed class Contract
 5 
 6 {
 7     /// The Unique Contract Identifier for this service
 8 
 9     [DataMember()]
10     public const String Identifier = "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 /// This service provides an implementation of the generic service
 3 /// 

 4 [Contract(Contract.Identifier)]
 5 [AlternateContract(generic.Contract.Identifier)]
 6 [DisplayName("Service Tutorial 9: Generic Service Implementation")]
 7 [Description("This service implements the generic service provided in Service Tutorial 8.")]
 8 [DssServiceDescription("http://msdn.microsoft.com/library/bb727257.aspx")]
 9 public class ImplementationService : DsspServiceBase
10 

2、 因为这个服务自己没有定义状态和操作,状态和操作都在通用服务协议有所定义了,只需在服务中使用罢了。如下:

 1 // The state of this service is exactly that of the generic service
 2 [ServiceState]
 3 private generic.GenericState _state = new generic.GenericState();
 4 
 5 // The operations port is exactly that of the generic service
 6 [ServicePort("/GenericServiceImplementation", AllowMultipleInstances = false)]
 7 private generic.GenericServiceOperations _mainPort = new generic.GenericServiceOperations();
 8 
 9 /// 
10 /// Default Service Constructor
11 /// 

12 public ImplementationService(DsspServiceCreationPort creationPort)
13     :
14         base(creationPort)
15 {
16 }
17 

剩下的工作是为通用协议中的定义的消息操作(message operations)添加处理方法(handler),如下代码定义了Get操作的处理方法:

1         /// Get Handler
 2         /// 
 3         /// 
 4         /// 
 5         // Note that this service does not need to implement Get unless there are
 6         // some specific functions that it must perform
 7         [ServiceHandler(ServiceHandlerBehavior.Concurrent)]
 8 
 9         public virtual IEnumerator<ITask> GetHandler(generic.Get get)
10         {
11             get.ResponsePort.Post(_state);
12             yield break;
13         }
14 

 

运行服务

运行服务后,在浏览器中Service Directory可以查看到两个服务genericserviceimplementationgenericserviceimplementation/servicetutorial8.因为服务没有扩展通用服务协议,所以这两个服务的状态和操作是一样的。

498)this.style.width=498;" border=0>

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

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

第二个服务提供了对通用服务协议的实现,同时又添加了一个自己的状态和消息操作,这样做的目的是:如果服务使用者只知道通用服务协议所定义状态和操作的话,他可以很容易使用这个服务,并且,这个服务还允许使用者使用扩展的状态和操作。

服务类型声明

和前面实现的服务不同,前面的服务没有自己的服务类型声明,

[1] [2] [3] 下一页

分享给朋友:
您可能感兴趣的文章:
随机阅读: