1

それぞれのメソッドを管理するために、複数DataContractsの同じ数の WCF サービスがあります。他のすべてのサービスでパラメーターとして使用する特定の[DataContract]呼び出しUserがあります。たとえば、ListCompany(User, CompanyId).

WCFのサービスであるCompanyを参考にサービスを作ると、本来とは違うところが[DataContract] User好きすぎる。これを解決する方法はありますか?Company.UserUser

4

2 に答える 2

2

複数のサービスで使用される、論理的に同じ DataContract

[サービス参照の追加... ] メニュー オプションを使用して、WCF サービス クライアントの通常の方法でサービス参照を追加している可能性があります。これを行うと、Reference.csサービスごとにファイルが生成され、サービスごとに異なる名前空間が作成されます。ただし、サービス間でコントラクトを共有しているため、[サービス参照の追加] ダイアログの [詳細...] ボタンをクリックし、[参照されたアセンブリで型を再利用] がオンになっていることを確認し、(最も簡単な方法で) [すべての参照されたアセンブリで型を再利用] がオンになっていることを確認する必要があります。がチェックされます。

[DataContract]これらのクラスを含むアセンブリへの通常のプロジェクトまたはアセンブリ参照が実際にない場合、これは機能しません。したがって、それらの参照を追加します。これらのクラスがサーバー側の実装に混在している場合は、それらを独自のアセンブリに移動し、クライアントとサーバーの両方で参照する必要があります。

複数のサービスで使用される、論理的に異なる DataContract

1 つのサービス クライアントに対して 1 つのコントラクトを使用し、別のサービス クライアントに対して 1 つのコントラクトを使用している 2 つの異なるタイプのユーザー (つまり、2 つの異なるコントラクト) が本当にある場合は、参照されたアセンブリで型を再利用するがチェックされていないことを確認する必要があります。各サービス参照は異なる名前空間にあります。

別の方法は、宣言するときにそれぞれに異なる名前を使用することです。

[DataContract(Name = "User"]
public class User { ... }

[DataContract(Name = "CompanyUser")]
public class User { .... }

上記のコードは、各Userクラスが異なるサーバー側の名前空間にあり、アセンブリも異なる可能性があることを前提としています。

于 2012-07-20T13:27:35.690 に答える
0

サービス参照を追加する WCF サービスを使用するためのより良い方法を検討することをお勧めします。このゴールデン アーティクルでは、VS に大量のコードを生成させることなく、すべてのソリューション間でデータ コントラクトを共有し、Chanel ファクトリを使用してデータ コントラクトを利用する方法について説明します。 http://www.netfxharmonics.com/2008/11/understanding-wcf-services-in-silverlight-2

理解するのは大変に思えるかもしれませんが、次のような魔法のないサービス アクセスなど、非常に役立つヒントが満載です。

ここで、クライアント アプリケーションに注意を向けます。まず最初に、魔法のようなサービス クライアントの作成に Visual Studio の [サービス参照の追加] を使用してはならないことを皆さんに思い出していただきたいと思います。コードは信じられないほど冗長で、管理が難しく、編集内容が上書きされやすく、ほとんどの場合、WCF を実際に学習しない言い訳として使用されます。マウスの使い方を知っているという理由だけで製品を知っている人に対処しなければならないことほど悪いことはほとんどありません。Juval Lowy がすべての著書や講演で、この欠陥のある機能を使用しないように人々に繰り返し言っているのには理由があります。幸いなことに、専門家として、魔法を使わずに物事を行う方法を理解する能力があります。

すでに何度も述べたように、WCF は ABC の概念に依存しています。アドレス、バインディング、およびコントラクトを指定するエンドポイントを作成して、WCF ホストを構成する方法を見てきました。結局のところ、クライアント側でも必要なのはこれだけです。.NET と Silverlight の両方で、アドレスとバインドをチャネル ファクトリのコントラクトとマージして、チャネルを作成します。これは単なる概念的なアーキテクトの話ではありません。これはまさにあなたのコードがどのように見えるかです (本当に優れたアーキテクチャの兆候です!) 以下は、私が言いたいことの .NET バージョンです:

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
    EndpointAddress endpointAddress = new EndpointAddress("http://localhost:1003/Person.svc");
    IPersonService personService = new ChannelFactory<IPersonService>(basicHttpBinding, endpointAddress).CreateChannel();
    //+
    Person person = personService.GetPersonData("F488D20B-FC27-4631-9FB9-83AF616AB5A6");

一読の価値あり。

于 2012-07-20T13:45:27.490 に答える