2009-06-08 13 views
2

作成するオブジェクトは、開発者とテストWCFサービスを参照する以外は同じです。基本的に、これらはサービス自体のオブジェクトであり、WCFデータコントラクトによって作成されるDTOのオブジェクトです。oo質問:2つの同様のオブジェクトに同じロジックを適用する

私のテストクライアントでは、dev WCFサービスに関連する2つのオブジェクト、またはテストWCFサービスに関連する2つのオブジェクトのいずれかを作成します。私はサービス契約などをテストするために同じロジックを適用します。

OO原則を使用して、好ましくはロジックを2回書く必要なく、これを構造化する最良の方法は何ですか?

参考として、私が作成しているオブジェクトを次に示します。最初のセットは "ASRServiceClient"からのものです。 2番目のセットは "ASRTestServiceClient"に由来します。

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

誰かに見せたいと思えば、あなたの質問はタイトルに書いてください。 – Macke

答えて

4

なぜあなたはあなたがに接続しているどのサービスに基づいて、クライアントのコードを変更する必要がありますか?あなたは2つの異なる.configファイルを持つことができませんか? devサービスへの接続とテストサービスへの接続を含む接続テスト/ devモードに基づいて.configファイルを切り替えるだけです。

もちろん、あなたのサービスの契約はインターフェースであり、開発者とテスト版の両方のサービスは同じ契約インターフェースを使用しますが、それはあなたが求めていたものではないようです。

編集:

あなたはまだ行っていない場合は、サービスのためのServiceContractインターフェイスを抽出します。あなたの開発者とテストサービスの両方がインターフェースを実装する必要があります。このような何か:

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

{namespace}はあなたのインターフェイスの名前空間の場所です、あなたのクライアントのためのあなたのapp.config(またはweb.configファイル)ファイルはこのようなものが含まれている必要があります。これらを両方とも単一の.configファイルに保存したい場合は、これが機能します。

サービスを使用するクライアントのコードは、次のようになります。 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あるので、あなたはそれを持っているコードは、オブジェクトのみを操作することインターフェイスタイプについて知っておく必要があります。オブジェクトを生成したサービスのバージョンは気にしないでください。

また、私はLearning WCFという本をMichele Leroux Bustamanteがお勧めします。このようなことをすべて行う方法の素晴らしい例!

+0

これは素晴らしいアイデアのようですが、設定ファイルをプログラムで変更する簡単な方法はありますか? – alchemical

1

インターフェイスを使用します。

0

私はインターフェイスを使用し、実行時にどのような具体的なクラスを作成するかを決定する設定ファイルを設定します。

0

サービスの環境固有のデータをサブクラスでカプセル化したTemplate methodを使用できます。 しかし、これはパターンの問題ではないかもしれません。環境固有の構成ファイルを持つことが最善の方法です。

関連する問題