• 面向接口的编程(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

  • 相关阅读:
    第五章 面向方面编程___通知类型
    从 C++ 到ObjectiveC
    iPhone/Mac ObjectiveC内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
    两个操作字符串的方法:读取指定位置的字符和找出某个字符串的位置
    SQLITE3使用总结
    iphone中如何进行多线程编程
    sqlite数据库在IOS中的运用
    重载、覆盖、隐藏
    (转)c/c++ 内存管理
    iPhone/Mac ObjectiveC内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1487585.html
Copyright © 2020-2023  润新知