WCF Part 2 : Defining contract, 原文
在上篇文章中,我们粗略讲述了WCF的ABC(Address, Binding and Contract)。 本章讲述契约(Contract)。
契约是在需要在类上显式定义的,只要给类加上[ServiceContract]属性即可. 在服务中,给方法加上[OperationContract]属性,即可暴露出来以供外部使用, 因为在服务中,方法是被称为操作的(operationsas)。
[ServiceContract]
public class Hello
{
[OperationContract]
string HelloWorld()
{
return "Hello world";
}
string HelloComputer()
{
return "Hello computer";
}
}
操作也是需要被显式地进行定义的,一个面向服务的规定。在上面的服务中,HelloComputer对于我们服务的使用者而言是不可见的,因为他没有使用[OperationContract]属性进行标注,而HelloWorld却是对外可见的,即使在.NET中,他的限定符为private。
接口(Interfaces)
实际上,通常将接口作为契约,具体的服务实现只需实现这个接口即可。这样做的好处有:
- 接口能够扩展/继承其他接口
- 一个类可以实现多个接口
- 可以在不违反契约的情况下修改服务的实现
- 可以通过不同版本的接口来对服务的版本进行控制
综上所述,最好的做好就是用接口并且实现这个接口。上面提到的两个属性,也必须显式地在接口中指定。
[ServiceContract]
public interface IHello
{
[OperationContract]
string HelloWorld();
string HelloComputer();
}
public class Hello : IHello
{
string IHello.HelloWorld()
{
return "Hello world";
}
string IHello.HelloComputer()
{
return "Hello computer";
}
}
在下一篇文章中,我们将看到如何host这个服务。在接下来的系列文章中,我们还会继续使用到这个服务,并且对上面说到的版本控制进行演示。