【问题标题】:In WCF, is it better to have multiple operation contracts or to have only one operation with polymorphic data contract?在 WCF 中,多态数据契约是拥有多个操作契约还是只有一个操作更好?
【发布时间】:2010-06-09 13:43:54
【问题描述】:

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

让我举个小例子:

[OperationContract]
action1Answer action1(action1data a);

[OperationContract]
action2Answer action2(action2data a);

[OperationContract]
actionAnswer action(actionContract a);

Action Contract 是一个抽象类,action1Contract 和 action2Contract 都将从中继承。动作合约将在其接口中指定 do() 成员函数,而该成员函数又将在子类中重载

我个人觉得第二种方法更有趣,因为它允许您将数据和操作很好地封装在派生的 actionContract 中,从而更容易添加新操作。但这是我第一次使用 WCF,所以您可能更了解!

【问题讨论】:

    标签: c# wcf datacontract operationcontract


    【解决方案1】:

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

    当您考虑开发服务层时,服务的最终使用者应该清楚要传递什么以及期望什么;方法2不能很好地处理。 (此外,当使用 WCF 执行 SOAP 然后从其他 .NET 项目中的 wsdl 加载时,它没有正确标记抽象类,也没有传输接口。WSDL 似乎无法描述不可实例化的基类.)

    不过,我必须承认,我认为使用 KnownTypeAttributes 的第二个过程非常棒(正如我刚才看到的 marc_s 已发布的那样) - 在允许未知的未来需求时,我自己使用过它。

    【讨论】:

    • 感谢您提供非常丰富的回复!我从来没有意识到 OO 和 SOA 会像这样矛盾。尽管我更喜欢第二种方法(来自 OO 背景),但为了服务描述,我可能会选择第一种。
    • 我目前正在阅读“Microsoft .NET:为企业构建应用程序”,它对 SOA 进行了很长的讨论,但它相当多地引用了 Martin Fowler 的“企业应用程序架构模式”;如果您有兴趣,两者都应该是一本不错的读物。
    【解决方案2】:

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

    但是:SOA/WCF 和多态性通常不能很好地匹配 - SOA(至少在进行基于 SOAP 的调用时)需要可以在定义您的服务的 WSDL/XSD 中表达的具体类。

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

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多