最近我在一篇文章中读到,在WCF中设计OperationContracts时,下面的方法1比方法2更优选/更有利。
方法1
[OperationContract()]
ResponseMessageType SomeOperation1 (RequestMessageType reqMessage);
方法2
[OperationContract()]
string SomeOperation2 (string parm1, string parm2);
我可以理解,任何参数列表中的任何未来更改/任何参数的类型,返回类型都将在Message Contract(RequestMessageType和ResponseMessageType)中完成。
但我无法意识到它如何成为一种优势?
如果有任何改变意图,必须在某处进行;如果我们在运营合同或消息合同中这样做会有什么不同。
我想了解并认识到第一种方法的优点。
答案 0 :(得分:4)
我认为在数据合同中这样做的好处是,在不破坏与旧客户端的兼容性的情况下,更容易修改现有数据合同。
假设您要将其他信息返回给调用者。使用简单的数据协定,只需添加一个额外的字段。老客户会忽略它。如果您希望新客户能够与旧服务器通信,只需将该字段设为可选字段。
我不知道如何在服务合同中这样做,而不引入新的服务合同或至少新的运营合同。实施起来不会困难得多,但会使界面更加混乱。
因此,您拥有“灵活”的数据合同(可能包含许多可选字段),而不是冗余操作混乱的服务合同。
这是妥协,但我赞成在大多数情况下使用“灵活”的数据合同。
例外情况是,如果您同时控制客户端和服务器,并且可以轻松确保每个客户端都是最新的。在这种情况下,只需修改(并理想地重命名)您喜欢的任何合同,并放弃对旧合同的支持。
BTW:另一个方向非常相似。您还可以在客户端发送到服务器的数据协定中包含其他(可选)字段。也许新客户希望添加一些可以加快处理速度的提示。或者添加其他数据,这些数据不是完成某些操作所必需的,但服务器可以将其存储在日志中以帮助进行故障排除等。