2011-09-04 121 views
3

WCF初学者的问题:有人告诉我,更改WCF合同代价高昂,需要不断维护(在客户端重新创建代理),因此首选方法有一个非常通用的方法联系点方法(根据给定的枚举参数决定如何行动)。WCF单点联系人

这听起来很臭,但我一直没能找到关于这个问题的任何信息(可能是对搜索关键字的选择不当)。 任何建议,或者可能是一个有用的链接?

谢谢!

回答

3

您不需要再次生成代理,只需确保客户端使用正确的接口版本即可构建。如果你非常小心,只添加方法,而不是删除或修改,那也可以。当然,这是一个很重要的管理责任。

要使用的界面,而不是生成客户端代理,由前一段时间检查我的问题:

WCF Service Reference generates its own contract interface, won't reuse mine

+0

+1:扩展合同不会破坏向后兼容性。如果客户没有使用合同中的任何新方法,则无需重新生成代理。 –

0

这是真实的,修改服务合同(接口)也将要求客户重新代理类最后使用新发布的WSDL,甚至可能要求客户将其代码更改为新代理的代码。我不认为你可以创建这样一个通用界面,可以在合同中进一步处理所有更改。必须非常仔细地写一份合同,以便它不会经常更改,如果需要更改合同,则最好使用不同的版本部署服务,以便旧客户仍可以使用旧版本。

1

这取决于你的意思是什么样的改变。改变服务合同确实代价高昂,不应该发生。服务合同是(或应该)处于足够高的粒度水平,这种变化非常罕见。

更常见的是对服务中暴露的类型的更改。这些更改更为常见,因此您需要以避免破坏现有客户端的方式来处理您的更改。

有几种方法可以做到这一点,例如使用接口多态地展示您的类型,但最简单的方法是简单地确保您的类型的更改添加新的数据成员字段并使新字段非强制。如果您可以限制对这些更改的更改,那么这对现有客户端的影响最小,并且可以使新客户端使用新字段。

希望这会有所帮助。

3

您在这里混淆了一些术语,我想您可能指的是已经在.Net 3.5 SP1中修复的已知缺陷。

重新创建WCF代理曾经是一个昂贵的操作在运行时。这在.Net 3.5中得到了改进,可以透明地缓存代理对象MSDN Blog

如果您指的是代理的“代码维护”,那么您所指的就是在客户端实现一个接口。如果您需要维护接口,那么这将回到基本的SOA。如果您的服务提供了尽可能多的访问权限和信息,假设您的服务将用于您尚未考虑的目的,那么您可能无需在创建该接口后对其进行修改。你也应该考虑你的升级路径。

Juval Lowy在他的书中有一个很好的关于这个问题的讨论,它有点密集但有一些很好的信息。

一条建议:WCF有很多功能可以让你的代码变得简单而优雅。如果您worreid有关维护,你可能被驱动做的是写一个接口:

string ServiceMethod(string xml) //returns XML 

不要这样做。花时间设计一个良好的可维护界面和良好的数据/消息合同。这将让WCF提供您在托管服务进行交互时免费获得的所有额外功能。

+1

+1为“不要这样做”... –

2

通用(如在非特定的,单片)接口很难理解和编程。不将API定义为API的原因是客户不可能理解正在发生的事情,并且当您更改此接口的(隐式)API时,您的客户端将以可怕的方式破解,而您无法在编译时间。我曾经触摸过WCF已经有一段时间了,但是如果你的客户端是内部的(相同的代码库,版本控制和部署方案),那么重新生成WCF代理非常容易,并且拥有一个“强大的”详细API将使你的生活比普通的要容易得多。