1、多角度认识契约。
1)、契约就和常说的合同意思差不多,是一方对另一方的承诺,接口是保证两个事物无缝接合的截面,只要双方接触的这个截面不变,其他地方发送变化,都会不影响到双方的正常接合。
从这个意思上将,契约和接口几乎可以划等号的,在软件行业,唯一不变的就是变化,为了提高软件的适用变化的能力,识别分离出“易变”与“不变”,依赖于“不变”,绝大部分的设计模式都是基于这个宗旨的,面向服务的编程,服务之间相互独立,不相互依赖,但是,服务之间注重交互,不是每个服务都是孤立的。
2)、元数据和服务契约:
元数据定义了程序集的类型成员的结构,中间代码则提供了方法的实现,服务契约和元数据很类似,服务契约定义了服务的结构,我们通过服务契约可以知道服务的结构。
3)、WSDL、XSD与服务契约:
在服务调用中,服务提供者通过服务契约把服务公布出去,服务消费者通过服务契约找到正确的服务进行消费,为了服务消费者能正确的找到并理解服务的结构,一个标准就是WS-*标准。
4)、服务契约的另一个责任就在于定义消息格式,消息格式以XSD的形式定义。
2、定义服务契约。
1)、ServiceContractAttribute:
public sealed class ServiceContractAttribute : Attribute
{
public string Name{get;set;}
public string Namespace{get;set;}
public string ConfigurationName{get;set;}
public Type CallbackContract{get;set;}
public ProtectionLevel ProtectionLevel{get;set;}
public bool HasProtectionLevle{get;}
public SessionMode SessionMode{get;set;}
}
a、接口还是类:处于设计原理的考虑,ServiceContractAttribute特性,尽量放在接口上。
b、Name和Namespace:
通过Name属性Namespace属性可以明确的设计服务契约的名称和命名空间,默认的情况下,服务契约的名称就是接口的类名,默认命名空间是http://temprui.org/,命名空间的作用和面向对象编程里的命名空间一样,解决服务契约名称相同的问题,通常做法,服务契约的命名空间名称设置成公司名称或者项目名称。
ServiceBehaviorAttribute服务行为特性,这个特性是应用在服务实现的类上面的,可以通过Name和Namespace属性设置服务的名称和命名空间。
Binding的名称和命名空间通过服务终结点的bindingName和bindingNamespace属性设置,客户端终结点是没有这个设置的,
c、ConfigurationName:可以使用这个属性设置配置里需要的名称。默认配置名称为服务契约的完全限定名(命名空间加类名)。
d、其他配置:
2)、OperateContractAttribute:
public sealed class OperationContractAttribute:Attribute
{
public string Name{get;set}
public string Action{get;set;}
public string ReplyAction{get;set;}
public bool AsyncPattern{get;set;}
public ProtectionLevel ProtectionLevel{get;set;}
public bool HasProtection{get;set;}
public bool IsInitiating{get;set;}
public bool IsTerminatng{get;set;}
public bool IsOneWay{get;set;}
}
a、操作名称:Name属性,可以指定操作方法在公布出去的服务契约的名称,默认就是方法名称,在服务实现方法重载的时候,要用到,两个重载的方法,在服务契约不能重名,必须利用Name属性重新命名。
b、Action和ReplyAction,分别控制某个操作的请求消息的和回复消息的<Action>报头,WCF服务端根据具体契约下的<Action>报头去找到对应到操作方法,所以,一个服务契约里每个操作方法的Action都是唯一的,在WCF中一种能够处理任何消息请求的操作叫做“未匹配消息处理器”,对于这样的操作需要设置Action为“*”,如果需要对回复消息进行路由,还要把ReplyAction设置成“*”,但是,对于一个服务契约中来说,这样的方法只能是唯一的。
3)、服务契约的继承:
对于服务契约的特性:ServiceContractAttribute和OperationContractAttribute,其中ServiceContractAttribute是不可以继承的,而OperationContractAttribute是可以继承的,比如:
[ServcieContract]
interface IFoo
{
[OpareationContract]
void F1();
}
[ServiceContract]
interface IBar:IFoo
{
[OperationContract]
void F2();
}
对于IBar要成为服务契约必须还得加上ServiceContract特性,由于OperationContract具有继承性,IFoo中的操作也会在IBar中出现。
浙公网安备 33010602011771号