面向接口的编程(WCF)

我经常比较Web Service,.NET Remoting,以及WCF这些技术的异同。我觉得WCF更好地体现了面向接口编程的思路。下面我用一个例子来讲解,大家一看应该就理解了

1. 创建解决方案

2. 创建服务接口

image

添加一个接口类型

image

添加引用

image

编写该接口。很简单。就定义了一个OperationContract

image

3. 创建服务类型

image

添加对接口类型的引用和System.ServiceModel的引用

image image

编写服务类型

image 

4. 创建宿主程序

image

添加对System.ServiceModel的引用,添加对服务以及接口的引用

imageimage

编写程序

image

【备注】这是完全用代码的方式进行托管的,当然还可以用配置的方式来完成

5. 创建客户程序

image

添加对接口类型的引用和System.ServiceModel的引用

image image

编写客户端代理类型

image 

6. 调试

image

image

image

7. 进一步扩展

我另外比较欣赏WCF 的是,它所用到的复杂类型也可以更好地在服务端和客户端之间共享。一般可以直接用一个Model项目来保存

【备注】关于这一点,我印象最深刻的是在Web Service的架构中,复杂类型在传递的时候并不那么理想。在生成客户端代理的时候,其实生成那个类型和服务端的那个不是一个东西。

image

添加引用

image

image

8. 修改接口,添加一个操作

image

image

9。修改服务,实现该操作

image

image

10. 修改宿主,只需要添加对Model的引用即可

image

11. 修改客户端

image

修改代理类

/// <summary>
/// 这个类型往常都是通过工具生成的,但也可以自己编写
/// </summary>
class HelloServiceClient : ClientBase<Contracts.IHelloContract>,Contracts.IHelloContract{
    public HelloServiceClient(Binding binding, EndpointAddress address) : base(binding, address) { }

    #region IHelloContract 成员
    public string HelloWorld()
    {
        return Channel.HelloWorld();
    }
    #endregion

    #region IHelloContract 成员

    public Model.Employee GetEmployee()
    {
        return Channel.GetEmployee();
    }

    #endregion
}

修改调用代码

static void Main(string[] args)
{
    Binding tcpBinding = new NetTcpBinding();
    EndpointAddress tcpAddress = new EndpointAddress("net.tcp://localhost:81/HelloService");
    HelloServiceClient proxy = new HelloServiceClient(tcpBinding, tcpAddress);
    Console.WriteLine(proxy.HelloWorld());

    Model.Employee employee = proxy.GetEmployee();
    Console.WriteLine(employee);

    Console.Read();
}

调试

image

原文地址:https://www.cnblogs.com/chenxizhang/p/1487585.html