質問
サービスコントラクト、プロキシ、およびサービスを別々のアセンブリに保持しない場合、サービスコントラクトとプロキシはクライアントアセンブリに存在し、サービスはサービスアセンブリに存在します。
データコントラクトを別のアセンブリに保持しない場合、クライアントサイドまたはサービスサイドのどこにデータコントラクトを置くべきですか?
データコントラクトは両方のアセンブリに存在できますか?
解決
典型的なサービス指向のシナリオでは、サーバー側のサービスライブラリにDataContractがあります。あなたに電話する人は誰でもあなたのサービスにクライアントプロキシ接続を追加することになり、実際にあなたのDataContractを複製します。
だから" normal"場合は、「マスター」がいます。サーバー側のDataContract、およびサービスにアクセスする各クライアントプロキシの個別のクラス。これらのクライアントコピーは、「同一のワイヤ」です。それらは同じメッセージ形式にシリアル化されます-クライアントとサーバーの間にあるのはこれだけです-シリアル化されたメッセージが前後に送信されます。
サービス開発者として、サーバー側にDataContractを用意する必要があります。しかし、サービスコントラクトにも同じことが当てはまります。これらはサーバー側にも存在する必要があります。そうしないと、サービスに接続する可能性のあるユーザーが使用するサービスインターフェースを世界に公開できなくなります。
サーバーごとに次の少なくとも2つのプロジェクトを提案します。
- サービスコントラクト(IServiceインターフェイス)、データコントラクト、および場合によってはフォールトコントラクトを含むクラスライブラリ
- 実際のサービス実装(サービスインターフェイスを実装するクラス)を含むクラスライブラリまたは自己ホスト型EXE (コンソールアプリ)
マーク
他のヒント
答えは-それは依存します。
通常はそれらを別々に保持することをお勧めしますが、それらを一緒に保持することも同じくらい良いオプションである場合があります。
それらを分離しておくと、オペレーションコントラクトをドラッグせずにデータコントラクトを参照して使用できます。これにより、アプリケーションの構造をより柔軟に設定できます。
契約を個別にバージョン管理することもできます。
しかし、それはすべて実際のアプリケーションに依存します。
クライアント側とサーバー側の両方が参照するインターフェイスとコントラクトを含む別のアセンブリを作成することを強くお勧めします。