2009-06-08 101 views
2

我有2個創建的對象,除了它們指向我的開發和測試WCF服務外,它們是相同的。基本上,這些是服務本身的對象,也是WCF數據合約創建的DTO的對象。oo問題:將相同的邏輯應用於2個相似的對象

在我的測試客戶端中,我創建了與開發WCF服務相關的2個對象,或者與測試WCF服務相關的2個對象。然後我應用相同的邏輯來測試我的服務合同等。

使用面向對象的原則構建這個最好的方法是什麼,最好不必編寫邏輯兩次?

作爲參考,這裏是我創建的對象。第一組來自「ASRServiceClient」。第二組來自「ASRTestServiceClient」。

ASRService.ASRServiceClient svc = new ASRService.ASRServiceClient(); 
ASRService.ASRItem tr1 = new ASRService.ASRItem(); 
+2

請在標題中寫下你的問題,如果你想讓別人看看它。 – Macke 2009-06-08 17:17:56

回答

4

爲什麼你需要根據你連接到服務修改客戶端的代碼?你不會只能有兩個不同的.config文件嗎?一個包含用於開發服務的連接,另一個包含用於測試服務的連接?只需根據測試/ dev模式切換.config文件即可。

當然,您的服務合同是一個界面,服務的開發和測試版本都使用相同的合同界面,但這似乎並不是您要求的。

編輯:

提取物的的ServiceContract接口爲您服務,如果您還沒有這樣做。你的開發和測試服務都應該實現這個接口。事情是這樣的:

[ServiceContract(Namespace="http://stackoverflow.com/questions/965977")] 
public interface IASRService 
{ 
    [OperationContract] 
    ASRItem GetASRItem(); 
} 

你的app.config(或web.config文件)文件爲您的客戶應該包含這樣的事情哪裏{namespace}是你的界面的命名空間位置。如果你想將它們保存在一個.config文件中,這將會起作用。

<system.serviceModel> 
    <client> 
    <endpoint name="ASRService" address="http://yourserver.com/ASRService" 
       contract="{namespace}.IASRService" binding="basicHttpBinding"/> 
    <endpoint name="ASRServiceTest" address="http://localhost/ASRService" 
       contract="{namespace}.IASRService" binding="basicHttpBinding"/> 
    </client> 
</system.serviceModel> 

使用服務的客戶端中的代碼如下所示。在ChannelFactory構造函數中指定配置的名稱。

ChannelFactory<IASRService> cf = new ChannelFactory<IASRService>("ASRService"); 
IASRService proxy = cf.CreateChannel(); 

ASRItem DevServiceItem = proxy.GetASRItem; 

OR

ChannelFactory<IASRService> cfTest = new ChannelFactory<IASRService>("ASRServiceTest"); 
IASRService proxyTest = cfTest.CreateChannel(); 

ASRItem TestServiceItem = proxyTest.GetASRItem; 

由於這兩個代理的類型總是IASRService,你只有操縱的對象需要了解該接口類型的代碼。它不應該關心哪個版本的服務生成了對象。

另外,我會推薦Michele Leroux Bustamante的書Learning WCF。關於如何做所有這些事情的好例子!

+0

這似乎是一個好主意,是否有一種簡單的方法來以編程方式更改配置文件? – alchemical 2009-06-08 18:02:59

0

我會使用一個接口,並在您的配置文件中有一個設置,它決定了在運行時創建的具體類。

0

您可以使用Template method,將服務的環境特定數據封裝在子類中。 但是,這可能不是一個模式的問題。最好是具有環境特定的配置文件。