2011-07-05 13 views
2

私は、EF4を使用するエンティティで操作を実行するためにWCFサービスを使用するWPFアプリケーションを使用しています。 マイプロジェクトの構造が次のとおりです。それぞれが同じエンティティを公開する複数のSVC参照

プロジェクト:EntityObjects

  • EDMXファイルが

プロジェクトを住んで、これは次のとおりです。WCFService

  • 参照EntityObjects
  • はデータを持っていますエンティティに対するアクションを実行する契約
  • は、Scheme.svc
  • をPartner.svc、Section.svcと呼ばれる3つの異なるSVCファイルを、持ってい

プロジェクト:DataLayer

  • はPartner.svc、section.svc、scheme.svcへのサービス参照を持っています

問題は、DataLayerプロジェクトでは、各svcファイルがエンティティオブジェクトの独自の参照を返すため、オブジェクトへのあいまいな参照が存在することです。

どうすればこの問題を回避できますか?

+0

複数のサービスに共通のエンティティオブジェクトがありますか? – BonyT

+0

はい、3つのサービスすべてで使用される1つのedmxがあります – Madeleine

+0

私は3つの異なるサービスを持つべきではなく、1つのサービスを持つべきだと思います。私はひどく設計されたプロジェクトを修正し、可能な限り保存しようとしています。 – Madeleine

答えて

3

このようには動作しません。 3つのサービス参照の間で同じデータコントラクトタイプを使用する場合は、data contract sharingを使用する必要があります。つまり、サービス契約を追加する前に、別々のアセンブリでデータ契約をクライアントプロジェクトに提供する必要があります。ほとんどの場合、これはサーバーとクライアントの間でデータコントラクトアセンブリを共有することを意味します。あなたのケースでは、EntityObjects全体をEFのものと共有することを意味します - それは悪いです。

があり、複数のソリューションです:別のプロジェクトに

  • 置くエンティティとEDMXのものと
  • 使用するカスタムデータ転送ではなく、データコントラクトなどのエンティティのオブジェクトの実体を持つ唯一のプロジェクトを共有し、これらのDTO
  • とアセンブリを共有します
  • アセンブリを共有せず、代わりにクライアント用にデータコントラクトの "コピー"を手動で作成します
  • 異なるサービスを通じて同じエンティティを公開しないでください
  • ご使用のアーキテクチャに合ったサービスが1つだけの場合

最後に2つの選択肢が、アプリケーションのアーキテクチャの詳細です。

+0

これは間違いなく現実世界の問題であり、可能な回避策をリストアップしてくれてありがとう。私はしかし、これのためのよりよい修正が、回避策の代わりに解決策があるべきだと思う。 MSがVSツールに組み込むことができるもの(WCF自体ではない場合) –

0

次のようにすることができます。

3つすべてのサービスへのアクセスをラップするラッパークラスを作成します。次に、DataLayerプロジェクトで関連するオブジェクトをサービスではなく直接参照し、必要に応じてラッパークラスで変換します。

関連する問題