Version control 服务合同变更的WF4工作流版本

Version control 服务合同变更的WF4工作流版本,version-control,workflow-foundation,workflow-foundation-4,workflowservice,Version Control,Workflow Foundation,Workflow Foundation 4,Workflowservice,我刚刚使用WCF的路由服务成功地实现了一个WF4“版本控制”系统。我有一个version1工作流服务,我在其中添加了一个新的决策活动,并将其保存为version2服务。因此,现在我有两个端点(具有相同的服务契约,即所有接收活动对于这两个服务都是相同的)和一个路由器,它检查消息的内容(对象上的一个“versionId”字符串,我的所有接收都接受该字符串作为参数),以决定要命中哪个端点 我的问题是,虽然这在服务契约没有更改的情况下可以正常工作,但如何处理从服务契约中添加或删除方法并创建version

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

我的问题是,虽然这在服务契约没有更改的情况下可以正常工作,但如何处理从服务契约中添加或删除方法并创建version3服务的需要?我最初的想法是,当我向我的客户机添加服务引用时,我使用最新的工作流服务的端点来获取最新的服务契约。然后,在配置文件中,我将连接到的端点更改为路由器的端点。但如果v1和v2与v3有不同的契约,这将不起作用。我的代理将使用v3的方法,而忘记所有关于v1和v2的内容


你知道怎么处理吗?我是否应该在我的工作流解决方案中创建一个实际的服务合同界面(而不仅仅是在我的接收活动中提供ServiceContractName)?

如果WCF合同发生变化,您的客户将需要了解附加操作以及何时调用它们。我使用了一些应用程序中的持久性存储中的活动书签(它包含WCF操作),通过检查已启用的书签并在此基础上启用/禁用UI控件,使客户端应用程序动态地适应工作流。当新的操作添加到新版本的工作流中时,客户端仍然需要更新。

当WCF还年轻时,我听到一些声音认为端点版本控制(即web服务)应该通过使用文件夹结构来完成。我从未亲自尝试过,但在我看来,仅仅分析这种策略的后果是一个极好的解决方案。我没有WCF的生产经验,但我将使用.NET的4.0版(ASP.NET、WCF、WF…)推出一个相当全面的解决方案,在这个阶段,我认为使用文件夹结构来分离端点的版本将是一个很好的解决方案


这种策略的本质是在您100%确定不再使用端点(特定版本)之前,永远不要更改或删除端点的契约。随着服务的发展,您只需添加新的契约和端点。如果一个人不是一个应有的结构化开发人员,这可能会导致代码重复。但是通过引入一个服务门面,重复将是微不足道的

我也经历过同样的情况。您可以通过自定义实现来维护该版本。在数据库中保存工作流服务URL。并根据需要调用它们

您可以通过客户端使用URL获取有关调用WF服务的信息


希望这能有所帮助

我想从你的回答中我不完全理解我的客户是如何意识到服务合同的变化的。我想象以下情况。比如说,V1有3个接听电话。服务合同是“隐含的”(即,我没有专门创建一个,但在WF设计器中的“服务合同名称”中添加了一个名称)。如果V2删除其中一个接收并添加一个新的接收,我如何让我的客户理解服务合同应该是2个接收的联合?我是否应该在工作流中设置服务合同名称的版本,以便客户最终获得多个服务合同?客户是如何知道原始服务合同是什么以及调用操作的顺序的?我猜是因为添加了服务参考和文档。改变也是一回事。执行更新服务引用并告诉他们要呼叫什么。与第一份合同没有区别。是的,因为有一个添加服务引用。不过,我的观点是,我的客户机仍然需要知道V1服务契约是什么,以便它能够支持持久性存储中的V1工作流。如果我照你说的做,只需更新我的服务引用,它只会得到V2的服务合同。我需要将我认为是的两种服务结合起来。由于WF4不支持“合同优先”的工作流设计,并且所有服务合同都是由使用服务的客户推断出来的,因此(我知道)没有办法定义一个包罗万象的服务合同(定义版本1和版本2的操作的合同)让我的客户执行所有这些操作。这样,无论持久化工作流来自哪个版本,它都可以恢复。路由服务在公共契约保持不变但工作流实现发生变化的情况下运行良好。在这种情况下,客户不需要知道任何更改。在这些情况下保持原位。如果公共契约发生更改,客户端应用程序需要知道每个工作流实例的有效契约是什么,而路由服务对此没有帮助。