zoukankan      html  css  js  c++  java
  • 继承在WCF中的问题和解决办法

    继承在WCF中的问题和解决办法

    1. 问题

    假设有代码如下:

    复制代码
    [ServiceContract]
    public interface IA
    {
        [OperationContract]
        string M1();
    }
    
    [ServiceContract]
    public interface IB : IA
    {
        [OperationContract]
        string M2();
    }
    
    public class A : IA
    {
        public string M1()
        {
            return "this is M1";
        }
    }
    
    public class B : A, IB
    {
        public string M2()
        {
            return "this is M2";
        }
    }
    复制代码

    但我们利用WCF发布B为服务时, 从客户端是看不到IA的 (生成的proxy class中不包含对IA的相关代码). 因此从客户端没法直接调用IA的方法M1, 这就是继承在WCF中遇到的问题. 

    2. 解决办法一

    搜索了一番我发现有些TX提供了一个有趣的解决方案: 手动改写proxy class, 让IA显形. 如: http://www.cnblogs.com/volnet/archive/2007/11/12/wcf_inherit.html

    这种方法很直观, 维持了原有的继承关系, 让Web Service看起来具备了OO的特性. 但是也有代价, 就是我们要手工维护proxy class.

    3. 解决办法二

    其实WCF提供了另外一种简单的解决办法, 通过配置来实现, 而且个人认为更加符合SOA的思想. 先来看看配置文件:

    复制代码
    <services>
      <service name="MyService" behaviorConfiguration="DefaultBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://MyService" />
          </baseAddresses>
        </host>
        <endpoint name="B" address="B" binding="basicHttpBinding" contract="IB"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    复制代码

    请注意高亮部分, 由于B是实现类型, 所以一般情况下我们会配置B的endpoint. 因此客户端访问MyService时只能够看到IB也在情理之中. 了解这点之后, 我们自然而然就能够想到如果要想同时访问IA, 那么增加一个endpoint即可. 事实正是这样!

    复制代码
    <services>
      <service name="MyService" behaviorConfiguration="DefaultBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://MyService" />
          </baseAddresses>
        </host>
        <endpoint name="A" address="A" binding="basicHttpBinding" contract="IA"/>
        <endpoint name="B" address="B" binding="basicHttpBinding" contract="IB"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    复制代码

    当我们做了如上改动之后, 在浏览器中打开http://MyService?wsdl我们将会看到它import了另外一个关联的wsdl. 它自己描述IB, 关联的描述IA. 用svcUtil生成代理类, 我们会发现两个Client Types, AClient和BClient. 通过这两个Client, 我们就能够分别访问子类和父类的方法了. 

    这种方式将继承关系给拉平了, 对于熟悉OO的TX们需要转换思路了接受它. 但是要知道SOA的一个重要思想就是用全新的视角展现功能, 扁平化服务正是一个主要趋势, 因而也就不觉得奇怪了. 

     
     
    分类: 其它
  • 相关阅读:
    0 到 1 掌握:Vue 核心之数据双向绑定
    前端性能优化, 从哪些方面入手? (缩略版)
    MDN中定义的Function.prototype.call()和apply()与bind()
    应聘前端开发的一次笔试题目(某数据挖掘分析公司)
    应聘前端开发的一次笔试题目(某电信子公司)
    应聘前端开发的一次笔试题目(某外资公司)
    算法之杨辉三角形(Java语言)
    算法之求质数(Java语言)
    微信小程序背景
    备份恢复(一)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3270175.html
Copyright © 2011-2022 走看看