2012-01-24 150 views
1

首先,我確實看過谷歌和stackoverflow,但似乎沒有什麼能滿足我的願望。用於DEV,QA和PROD版本的WCF服務

這就是說。我正在使用從以前的開發人員繼承的MVC應用程序(它也可以是Web窗體應用程序)。目前的服務參考點在生產服務器上,我想簡單地指向本地開發服務器。理想情況下,我想不編輯web.config文件從dev更改爲prod(特別是如果它是爲幾個地方等)。

因此,也許有一個「最佳做法」添加額外的Web引用和能夠通過非常少的配置更改快速「交換和測試」DEV引用到PROD引用。

也許是一個設計模式,或一個appconfig設置來促進這個過程?將它與服務引用的構造器注入鬆散地結合起來是非常理想的。有關如何最好地實現這一點的任何想法?

+1

如果您使用的是Visual Studio 2010,那麼最佳做法是使用Web.config轉換。否則,最好的做法是編輯web.config。這就是它的目的。 –

+0

@JohnSaunders感謝您的回覆。因此,如果我看到以下使用(ContractService.ContractServiceContractClient client = new ContractService.ContractServiceContractClient()){ContractService.AddContractCommentRequest request = new ContractService.AddContractCommentRequest();'那麼我當然想要添加一個新的Contract Service指向一樣的名字?但在2010年只是編輯轉換部分? –

+0

爲此,我在hosts文件中使用了dns條目。 例如在生產環境中,服務託管在services.myapplication.com中。 我有我的本地機器中的服務副本,我的主機文件將轉發這些請求。 這是不好的做法嗎?我可以將其更改爲任何我想要的環境(prod/test/dev或local)...而不更改配置文件。 – Romeo

回答

4

另一種選擇是爲指向不同地址的相同服務添加多個端點配置。然後,當您創建服務客戶端的新實例時,您將傳遞端點配置的名稱。

ContractServiceContractClient client = 
new ContractServiceContractClient("DEV_Endpoint"); 

ContractServiceContractClient client = 
new ContractServiceContractClient("PROD_Endpoint"); 

而在你的ServiceReference配置

<endpoint address="http://localhost:7821/ContractService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_ContractService" 
      contract="ContractServiceReference.IContractService" 
      name="DEV_Endpoint" /> 

<endpoint address="http://service.apps.com/ContractService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_ContractService" 
      contract="ContractServiceReference.IContractService" 
      name="PROD_Endpoint" /> 

然後,如果你只需要創建一個全局靜態字符串或把某些東西在你的應用.config包含th您想要使用的端點配置的名稱,那麼您只需在該位置更改它,並且它將在整個應用程序中更新。

這裏唯一的問題是,如果您對同一合同有多個端點配置,則無法通過要使用的端點配置,就無法創建服務客戶端實例。

+0

好吧,到目前爲止,我喜歡這個。但是,我想要使用構造函數注入並需要決定使用哪個。我想我需要保持這個有點抽象。總的來說,看起來不錯我只是試圖擺脫直接的依賴關係。你將如何處理兩者之間的決定,保持代碼與DI等鬆耦合。 –

+0

你總是可以使用一個屬性。 private String EndPoint { get { if(... some condition) return this.ProdEndpoint;其他 返回this.DevEndpoint; } } 然後,對於條件,您可以運行一個包含指示要使用哪個端點的值的常量檢查。然後你可以將不同的端點存儲爲常量。 – mcallan

0

我通常做的是在數據庫中擁有所有設置,並且對於每個環境我們都有不同的數據庫連接字符串(機器是不同的)。

在app/web.config中,我們只需更改1個鍵,指定我們指向哪個環境,然後其他所有內容都來自數據庫中的設置表,每個環境包含不同的值。對於服務引用,檢入代碼始終只指向localhost,並且在運行時,url是從db中檢索的設置中分配的。

+1

是的,我明白你在說什麼。在這種情況下,我沒有數據庫表或環境設置,我想將它存儲在數據庫中。這當然是一個選擇。謝謝。 –

+0

「我們只需更改1個鍵」:這是自動檢測的值分配還是必須手動執行加密操作?如果是的話,你的調查基礎是什麼? –