2

我刚刚成功实现了使用WCF路由服务的WF4“版本控制”系统。我有一个版本1工作流服务,我添加了一个新的决策活动并将其保存为版本2服务。因此,现在我有两个端点(具有相同的服务合约,即所有接收活动对于这两个服务都是相同的)和一​​个检查消息内容的路由器(对象上的“versionId”字符串,我所有的Receive都接受为参数)来决定要点击哪个端点。服务合同更改的WF4工作流版本

我的问题是,虽然这工作正常,但没有对服务合同进行任何更改时,如何处理需要添加或删除我的服务合同中的方法并创建版本3服务?我最初的想法是,当我将服务引用添加到客户端时,我使用最新的工作流服务的端点来获取最新的服务合同。然后,在配置文件中,我更改了连接到路由器端点的端点。但是,如果v1和v2与v3有不同的合约,这将不起作用。我的代理将有v3的方法,并忘记所有关于v1和v2。

任何想法如何处理?我应该在我的工作流解决方案中创建一个实际的服务合同接口(而不是仅在我的接收活动中提供ServiceContractName)?

回答

1

如果WCF合同更改,您的客户需要了解其他操作以及何时调用它们。我已经使用活动书签(它包含WCF操作)从某些应用程序中的持久性存储中使客户端应用程序动态适应工作流,方法是检查启用的书签并基于此启用/禁用UI控件。将新操作添加到新版本的工作流程时,客户端仍然必须更新。

+0

我想我不完全从你的回答了解我的客户是如何意识到的服务合同的变更。我想象下面的情况。 V1有3个接听电话。服务合同是“隐含的”(即我没有专门创建一个,但在WF设计师的“服务合同名称”中输入了一个名称)。如果V2取消其中一个接收并添加新接收,我如何让我的客户明白服务合同应该是2的联合?我应该在工作流程中更新我的服务合同名称,以便客户得到多个服务合同? – Thelonias 2011-03-28 14:19:22

+0

客户是如何知道原始服务合同是什么以及以什么样的顺序进行操作的?我猜是因为添加服务参考和文档。改变是一回事。做一个更新服务参考并告诉他们要调用什么。第一份合同确实没有什么区别。 – Maurice 2011-03-28 18:56:41

+0

是的,因为添加服务引用。不过,我的观点是,我的客户仍然需要知道V1服务合同是什么,以便它可以在持久性存储中使用V1工作流程。如果我按你说的做,只更新我的服务参考,它只会得到V2的服务合同。我需要2我想的组合。 – Thelonias 2011-03-28 20:32:43

1

虽然WCF很年轻,但我听到一些声音认为端点版本控制(对于Web服务来说)应该通过使用文件夹结构来完成。我从来没有想过要自己去尝试,但只是分析这种策略的后果在我看来是一个很好的解决方案。我没有WCF的生产经验,但即将推出使用.NET 4.0版本(ASP.NET,WCF,WF ...)的相当全面的解决方案,并且现阶段我会争论使用文件夹结构来分离版本的端点将是一个很好的解决方案。

这种策略的实质将是永远不会更改或删除端点(特定版本)的合约,直到您100%确定它不再被使用为止。当您的服务发展时,您只需添加新的合同和端点。这可能导致代码重复,如果一个人不是这样的结构化开发人员应该。但通过引入服务门面的重复将是微不足道的