2

論理的に異なる2つのWCFサービスがあり、それらを分離したいと考えています。それぞれに、同じデータコントラクトを返す操作があります。1つのSilverlightクライアントが両方のサービスを消費します。Silverlightクライアントのサービス参照を各サービスに追加すると、生成されたコードで単一のデータコントラクトが2回終了します。両方のサービス参照でデータコントラクトの同じ定義を使用することは可能ですか?

私が読んだことから、Silverlight以外のクライアントの場合、サーバーとクライアントの両方によって参照される個別のアセンブリにデータコントラクトをコンパイルすることで可能です。ただし、これはSilverlightでは不可能です(少なくともSilverlight 3では)。

ありがとう、
ロブ

4

3 に答える 3

2

スティアン、

早速のお返事ありがとうございます。ミゲル・カストロのスクリーンキャストを見ましたが、とても参考になりました。残念ながら、Silverlightの状況はカバーされていません。しかし、それを出発点として使用することで、他の人が役立つと思われる何かを機能させることができました。

ServerDataContractsとSilverlightDataContractsの2つのアセンブリを作成します(これはSilverlightアセンブリとして)。それぞれのAssemblyInfo.csに、次の行を追加します。

[assembly: ContractNamespace("http://YourNamespaceUri",
 ClrNamespace = "YourDataContractsNamespace")]

すべてのDataContractsをServerDataContractsアセンブリに追加します。SilverlightDataContractsアセンブリで、プロジェクト(またはサブフォルダー)を右クリックし、[既存のアイテムの追加]を選択します。ServerDataContractsアセンブリのDataContractsを参照し、追加するものを選択します。「追加」を押さないでください!!! 代わりに、[追加]の横にある下向き矢印をクリックして、[リンクとして追加]を選択します。これにより、SilverlightDataContractsプロジェクトがServerDataContractsプロジェクトの既存のファイルにリンクされます。これで、1つを編集すると、両方のプロジェクトに変更が加えられます。コンパイルすると、プロジェクトは正しいターゲットで個別にコンパイルされます。

次に、ServerDataContractsアセンブリをサービスコントラクトプロジェクトへの参照として追加します。SilverlightアプリケーションへのSilverlightDataContractsアセンブリについても同じようにします。Silverlightクライアントからサービスにサービス参照を追加する場合、データコントラクトは生成されません。代わりに、アセンブリからのものを使用する必要があります。

私はこれを機能させましたが、生成されたデータコントラクトクラスによって提供される機能の一部がまだ不足しています。生成されたクラスはINotifyPropertyChangedを実装します。これは、silverlight/wpfでのデータバインディング時に非常に役立ちます。これを自分で実装することはできますが、かなり面倒であり、サーバーでPropertyChangedイベントをサブスクライブすることはおそらくない場合でも、サーバーコードはすべてのプロパティセットでこれらのイベントハンドラーをすべて実行する必要があります。

私はまだこれを処理するためのよりクリーンな方法を探しています。Silverlight 4を使用すると、クライアントとサーバーの両方で同じアセンブリを使用できるという点で、これが簡単になるようです(コンパイルされたコードは互換性があります)。残念ながら、それは私のニーズには遠すぎます。

于 2010-02-18T21:41:52.140 に答える
1

svcutilを使用してクライアントを生成してみましたか。複数のサービスエンドポイントを指定すると、すべて正常に機能しますが、クライアントの生成中に大量のエラーが発生します。

于 2010-02-26T03:55:45.290 に答える
0

これはイライラしますが、うまくいきました。私には1つの主要なサービスと、いくつかのサポートサービスがあります。すべてのデータコントラクトが属するメインサービスであり、サポートサービスはメインサービスで指定されたデータコントラクトを再利用する必要があります。

メインサービスのクライアントとしてのみ機能するSilverlightアセンブリを作成しました。次に、Silverlightアプリケーションにそれを参照させました。次に、Silverlightアプリケーションで、サポートサービスを追加しました。サポートサービスを追加する場合、詳細画面では、参照されるアセンブリのタイプを再利用するかどうかを指定できます。デフォルトでオンになっています。メインサービスは参照されるアセンブリで指定されるため、すべてのサポートサービスはメインサービスのデータコントラクトを使用します。

きれいではありませんが、機能します。

于 2010-02-18T22:17:49.283 に答える