代码之家  ›  专栏  ›  技术社区  ›  Gab Royer

在WCF中,拥有多个操作契约还是只有一个具有多态数据契约的操作更好?

  •  3
  • Gab Royer  · 技术社区  · 15 年前

    我想知道在WCF中,使用多个操作契约还是只有一个具有多态数据契约的操作契约更好。

    让我举个小例子:

    [OperationContract]
    action1Answer action1(action1data a);
    
    [OperationContract]
    action2Answer action2(action2data a);
    

    [OperationContract]
    actionAnswer action(actionContract a);
    

    action contract将是action1contract和action2contract都将从中继承的抽象类。行动合同将规定 do() 接口中的成员函数,而该函数又会在子类中重载

    我发现第二种方法更有趣,因为它可以很好地将数据和操作封装在派生的ActionContract中,从而更容易添加新的操作。但这是我第一次使用WCF,所以你可能知道得更好!

    2 回复  |  直到 15 年前
        1
  •  3
  •   Matt DeKrey Kiran    15 年前

    这个问题接近于OO多态性和SOA这场神圣战争的边缘,但我将提供我的两分钱:

    当您考虑开发一个服务层时,应该向服务的最终消费者清楚应该传递什么和期望什么;方法2不能很好地处理这个问题。(同样,在其他.NET项目中使用WCF执行SOAP,然后从WSDL加载时,它没有正确地标记抽象类,也没有传输接口。看来,wsdls无法描述不可实例化的基类。)

    尽管如此,我必须承认,我认为第二个过程使用knowntypeattributes(正如我刚才看到的Marc_所发布的那样)是很好的——当考虑到未知的未来需求时,我自己使用了它。

        2
  •  2
  •   marc_s    15 年前

    我同意从OOP的角度来看,方法2看起来更好。

    但是:SOA/WCF和多态性通常不太匹配——SOA(至少在进行基于SOAP的调用时)需要具体的类,这些类可以在定义服务的WSDL/XSD中表示。

    可以 使用基于公共基类型的派生数据类型-如果这样做,则必须查看 KnownType 属性(或) ServiceKnownType )向WCF发出信号,表明您可能返回的内容不是操作合同实际规定的内容。