我想知道在WCF中使用多个操作合同或只有一个操作合同与多态数据合同是否更好。
让我举个小例子:
[OperationContract]
action1Answer action1(action1data a);
[OperationContract]
action2Answer action2(action2data a);
或
[OperationContract]
actionAnswer action(actionContract a);
动作合约将是一个抽象类,action1Contract和action2Contract都将继承该类。操作合同将在其接口中指定do()
成员函数,该函数将在子类中重载
Personnaly我发现第二种方法更有趣,因为它允许您在派生的actionContract中很好地封装数据和操作,从而更容易添加新操作。但这是我第一次使用WCF,所以可能你知道的更好!
答案 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,您可能会返回除操作合同之外的其他内容。