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%確定它不再被使用爲止。當您的服務發展時,您只需添加新的合同和端點。這可能導致代碼重複,如果一個人不是這樣的結構化開發人員應該。但通過引入服務門面的重複將是微不足道的