2012-05-13 8 views
4

WCFコントラクトのインターフェイスを3番目のDLLに移動し、手作業でプロキシを生成しているときにそれらをクライアントから消費したいと考えています。別のdllにWCFコントラクトを移動する

プロキシを生成するためにクライアントから消費するとき、DLLのこれらのインターフェイスには[ServiceContract]属性が必要ですか?

契約だけを持つDllとクライアントとサーバーの間で共有するDTOの名前は何ですか。

+0

「手作業でプロキシを生成する」とはどういう意味ですか?私が理解しているように、既存のアセンブリからクラスを再利用してプロキシを生成したいと考えています。それは事実ですか? –

+0

@Andriy Buday yes –

答えて

5

WCFデータとサービス契約を別々のアセンブリに配置するのは非常に一般的な方法です。私の以前のプロジェクトでは、Company.OurProject.Contracts.dllのような名前を付けました。 既存のクラスを再利用してプロキシを生成するには、サービス契約([ServiceContractAttribute]とマークされている)と対応するデータコントラクトのインターフェイスをそのアセンブリに配置する必要があります。私は実際にサービスを実装することを避けるだろう。ここで

は、「参照アセンブリにおける再利用の種類」を選択した際に再利用できるものにもっと洞察力を持つように別の偉大な答えです:WCF Service Reference generates its own contract interface, won't reuse mine

1

これは、一般的な、おそらく推奨されるアプローチです。

はい、契約書dllに記載されているサービスインタフェースにサービス契約を置く必要があります。

名前空間がdllの名前と一致する必要はないことに注意してください。あなたの現在のアセンブリがCompanyName.Technology.Serviceのようなネームスペースを持つCompanyName.Technology.Service.dllのようなものであると仮定すると、別のアセンブリへのコントラクトを抽出する必要がありますが、ネームスペースを同じにして(それでも意味があれば)、アセンブリ名はCompanyName.Technology.Service.Contractsです。あなたが望んでいないのは、その中に "contracts"という名前の名前空間です。

+0

名前空間を維持し、その中に「契約」という名前を持たないことが重要なのはなぜですか?下位互換性のために? – xr280xr

+1

@ xr280xr - ServiceContract属性でカスタム名前空間を設定していない場合、名前空間を変更したくない別のアセンブリに移動していました。これにより、既存のクライアント間で契約の不一致が発生します。 – Bronumski

0

*私は* .ServiceContracts.dllを使用しています。これは私のシステムに複数のコントラクトアセンブリがあるためです。たとえば、DataContracts.dllはデータストアにアクセスするために使用されます。

+0

また、バイナリを共有している場合は、生成されたプロキシを回避します。私はそれをWCFで作業するよりきれいな方法だと思っています。プロキシをラップする生成コードではなく、直接プロキシを使用することができます。 –

関連する問題