2010-09-22 108 views
1

最近我在一篇文章中读到,在WCF中设计OperationContracts时,方法1跟随比方法2更受欢迎/优势。WCF中的请求和响应范式

方法1

[OperationContract()] 
ResponseMessageType SomeOperation1 (RequestMessageType reqMessage); 

方法2

[OperationContract()] 
string SomeOperation2 (string parm1, string parm2); 

我可以理解,在参数/类型的任何参数列表中的任何改变未来,返回类型将刚做完在消息合约(RequestMessageType和ResponseMessageType)中。

但我不知道它是如何成为一个优势?

如果有任何更改的目的,必须完成的地方;如果我们在“操作合同”或“消息合同”中执行操作,会有什么区别。

我想了解并认识到第一种方法的优点。

回答

4

我认为在数据合同中做这件事的好处是,修改现有的数据合同而不破坏与旧客户端的兼容性会更容易。

假设您想要将其他信息返回给调用者。使用简单的数据合同,只需添加一个额外的字段。老客户会忽略它。如果您希望新客户能够与旧服务器交谈,只需将该字段设置为可选。

我不知道如何在服务合同中做到这一点,而不需要引入新的服务合同或至少一个新的运营合同。实现不会更困难,但会更加混乱界面。因此,您拥有“灵活”的数据合同(可能有许多可选字段)与冗余操作混杂在一起的服务合同。

这是一个妥协,但我赞成在大多数情况下“灵活”的数据合同。

如果您同时控制客户端和服务器,并且可以轻松确保每个客户端都是最新的,则会出现异常。在这种情况下,只需修改(并理想地重命名)您喜欢的任何合同,并放弃对旧合同的支持。

顺便说一句:其他方向非常相似。您还可以在客户端发送到服务器的数据合同中包含其他(可选)字段。也许新客户想要添加一些可以加速处理的提示。或者添加不需要完成某些操作的附加数据,但服务器可以将其存储在日志中以帮助进行故障排除等等。

+0

我同意@pgroke,您将通过使用数据合同获得更高的灵活性。但是,如果你不能控制客户(即你的客户不能重建)。那么您还需要考虑数据合同版本控制。这些文章将指向您正确的方向:http://msdn.microsoft.com/en-us/library/ms731138.aspx和http://msdn.microsoft.com/en-us/library/ms733832.aspx – 2010-09-23 07:47:00