Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF中,使用多个操作契约还是只使用一个具有多态数据契约的操作更好?_C#_Wcf_Datacontract_Operationcontract - Fatal编程技术网

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

C# 在WCF中,使用多个操作契约还是只使用一个具有多态数据契约的操作更好?,c#,wcf,datacontract,operationcontract,C#,Wcf,Datacontract,Operationcontract,我想知道在WCF中使用多个操作契约还是只有一个具有多态数据契约的操作契约更好 让我举一个小例子: [OperationContract] action1Answer action1(action1data a); [OperationContract] action2Answer action2(action2data a); 或 ActionContract是action1Contract和action2Contract都将继承的抽象类。动作契约将在其接口中指定do()成员函数,而该函数又

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

让我举一个小例子:

[OperationContract]
action1Answer action1(action1data a);

[OperationContract]
action2Answer action2(action2data a);

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

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

从面向对象的角度来看,我同意方法2看起来更好

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


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

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

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


尽管如此,我必须承认,我认为第二个过程使用KnownTypeAttributes(正如我刚才看到的marc_s所发布的)是非常好的——我自己在考虑未知的未来需求时也使用过它。

感谢您提供了非常翔实的回复!我从未意识到OO和SOA会像这样相互矛盾。尽管我更喜欢第二种方法(来自OO背景),但出于服务描述的考虑,我可能会选择第一种方法。我目前正在阅读“Microsoft.NET:为企业构建应用程序”,其中对SOA进行了大量讨论,但它引用了Martin Fowler的“企业应用程序架构模式”相当多,;如果你感兴趣的话,这两本书都应该是很好的读物。
[OperationContract]
actionAnswer action(actionContract a);