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

时间:2010-06-09 13:43:55

标签: c# wcf datacontract operationcontract

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

让我举个小例子:

[OperationContract]
action1Answer action1(action1data a);

[OperationContract]
action2Answer action2(action2data a);

[OperationContract]
actionAnswer action(actionContract a);

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

可以使用基于公共基类型的派生数据类型 - 如果你这样做,你将不得不调查KnownType属性(或ServiceKnownType)来发出信号对于WCF,您可能会返回除操作合同之外的其他内容。