这篇文章演示怎样定义一个通用服务协议(generic service contract),通用服务协议类似面向对象编程中的接口,它只提供规范,而不提供具体实现,服务开发者将会为这些规范提供具体的实现,服务使用者不用去关心不同的服务的具体的实现,因为这些服务有相同的状态和操作,也就是通用服务协议所定义的状态和操作。
虽然上面的这个通用协议类似于接口,但是和接口又有很大的不同,这个在Service Tutorial 9 (C#) - Implementing and Extending Service Contracts,会看到。
这个实例由C#写的,你可以在下面的目录中找到它
Samples"ServiceTutorials"Tutorial8"CSharp
第一步:创建项目
通DssNewService工具或安装了msrs的vs2008创建一个服务项目,在这个项目中我们只需要ServiceTutorial8Types.cs文件,而不需要Servicetutorial8.cs文件,这里只有服务状态和操作的定义,即所说的协议(Contract),如果想用这些定义,可以实现一个新的服务,在另外一个服务中使用这里定义协议。
第二步:设置服务声明属性
在AssemblyInfo.cs文件中,使用ServiceDeclaration 属性向DSS基础架构指示这个程序集包含一个通用服务的协议而没有实现。
很有可能在一个程序集中既有通用协议的声明又有这个服务的实现,前提是他们定义在不同的clr命名空间中,你可以用下面的方式向DSS指示。
“这里命名空间的限制有些不可思议,一个DSS项目中如果有多个服务,DSS要求这些服务必须在不同的命名空间中。”
关于ServiceDeclaration的枚举类型的详细信息见下表:
Member name |
Description |
NonDssService |
Not a Dss Service :程序集中没有DSS服务 |
ServiceBehavior |
Assembly contains service behavior declarations including the port types used to describe message patterns and types Replaces [ServiceBehaviorDeclaration] 程序集包含服务的实现包括端口允许的操作,包括对消息体和消息类型的描述。 |
DataContract |
Assembly contains data contract declarations. Replaces [ServiceDataDeclaration] 程序集包括数据协议(通信时的消息体)的描述。 |
Proxy |
Assembly is a generated Dss Proxy |
Transform |
Assembly is a generated Dss Transform |
第三步:定义通用服务协议(Contract)
这个服务的协议和其他的服务的协议没有什么不同,这里的定义域如下:
1 /// <summary>
2 /// Generic Service without service implementation
3 /// </summary>
4 [DisplayName("Service Tutorial 8: Generic Service Contract")]
5 [Description("This is a generic contract without an actual service implementation. See Service Tutorial 9 for various ways to use this contract.")]
6 [DssServiceDescription("http://msdn.microsoft.com/library/bb727256.aspx")]
7 public sealed class Contract
8 {
9 /// <summary>
10 /// The Dss Service contract
11 /// </summary>
12 [DataMember()]
13 public const String Identifier = "http://schemas.tempuri.org/2007/08/servicetutorial8.html";
14 }
15
第四步:定义通用服务的状态(State)
同样,服务的状态和其他的服务业没什么区别,记得用DataContract, DataMember 和 DataMemberConstructor去标记这个类。
1 /// <summary>
2 /// State for the generic service
3 /// </summary>
4 [DataContract]
5 [DisplayName("Generic Service State")]
6 [Description("Specifies the state of the generic service.")]
7 public class GenericState
8 {
9 string _firstName;
10 string _lastName;
11
12 [DataMember]
13 [Description("Specifies the first name of a person.")]
14 [DisplayName("First Name")]
15 public string FirstName
16 {
17 get { return _firstName; }
18 set { _firstName = value; }
19 }
20
21 [DataMember]
22 [DisplayName("Last Name")]
23 [Description("Specifies the last name of a person.")]
24 public string LastName
25 {
26 get { return _lastName; }
27 set { _lastName = value; }
28 }
29 }
30
31
第五步:定义通用服务的端口操作(Operations)
呵呵,和前面一样,不多说,如下所示,我们定义了Get和Replace操作。
1 /// <summary>
2 /// Generic Service Main Operations Port
3 /// </summary>
4 [ServicePort]
5 public class GenericServiceOperations :
6 PortSet<DsspDefaultLookup, DsspDefaultDrop, Get, Replace>
7 {
8 }
9
10 /// <summary>
11 /// Get Operation
12 /// </summary>
13 [Description("Gets the current state.")]
14 public class Get : Get<GetRequestType, PortSet<GenericState, Fault>>
15 {
16 }
17
18 /// <summary>
19 /// Replace Operation
20 /// </summary>
21 [Description("Replaces the current state.")]
22 public class Replace : Replace<GenericState, PortSet<DefaultReplaceResponseType, Fault>>
23 {
24 }
25
第六步:编译
和其他服务的编译一样,编译这个项目会得到一个dll文件,因为没有服务的实现,所有不会生成一个服务,在Service Tutorial 9 (C#) - Implementing and Extending Service Contracts中我们会看到使用不同的方法去实现和扩展这个通用的服务协议。
这个是Service Tutorial 9 (C#) 中提到的Service Tutorial 8 (C#) 还好,文章很短,不过有几个值得注意的地方,比如关于命名空间的限制.......
转自:http://www.elooog.cn/post/64.html