3

我想知道在 WCF 中使用多个操作合同或只有一个操作合同与多态数据合同是否更好。

让我给你一个小例子:

[OperationContract]
action1Answer action1(action1data a);

[OperationContract]
action2Answer action2(action2data a);

或者

[OperationContract]
actionAnswer action(actionContract a);

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

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

4

2 回答 2

3

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

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

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

于 2010-06-09T14:03:57.197 回答
2

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

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

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

于 2010-06-09T14:00:27.950 回答