2011-08-10 9 views
2

WCFサービスを公開するEntity Framework(4.1)を使用してWebサイトを作成しています.WCF経由でサーバーと通信するSilverlightクライアントがあります。私は、なしでのWCFサービスでいくつかのエンティティを送って(そしておそらく受け取って)、プロキシ/ラッパー等のクラスを作りたいと思っています。たとえば、Username、Password、Emailフィールドを持つUserエンティティタイプがあります(実際はもっと多くなりましたが、これを単純にしておくだけです)。このオブジェクトをSilverlightクライアントに送信します。ユーザー名とメールを送信している間、私は(明らかに)Passwordプロパティをクライアントに送信したくありません。今、私は、属性が[Serializable][DataContract]の属性を持つラッパーを作成しています。フィールドは[DataMember]という属性を持ち、必要なフィールドのみを含み、新しいインスタンスを作成し、エンティティオブジェクトから値をコピーし、そのプロキシオブジェクトを送信します。それは動作しますが、それは不便で非常に苦しいです。私が必要とするのは、送信したいプロパティを直接設定し、単に他のものを公開しないという仕組みです。エンティティモデルのコードを変更することはできません(属性の追加/編集).EDMXに触れるたびに自動再生されます。選択したメンバーだけをクライアントに公開する方法はありますか?WCFでエンティティを直接送信する方法

+2

良い質問です!あなた自身のカスタムPOCOを公開することは、私がそれを行う方法を知っている唯一の方法です。 – Jay

+1

私はジェイに同意します。必要な[DataMembers]のみを含む[DataContract]属性で装飾されたDTOクラスを作成する必要があります。 EF生成エンティティからDTOにマップする必要があります。 –

+0

さて、私はそれが最善の方法であることを確かめたいと思っていたように、私は同じ方法を続けています。私はその答えを受け入れることができました。とにかく答えとして: –

答えて

2

クライアントでPROXYエンタイトを回避するには、クライアントがすでにサーバーエンティティアセンブリを参照していることを確認して(クライアント側とサーバー側)同じエンティティ(クライアント側とサーバー側)を再利用できます彼ら自身のアセンブリに)。その後、サーバ参照の詳細オプションをチェックし、「参照されたアセンブリのタイプを再利用する」がチェックされていることを確認します。

これにより、プロキシインターフェイスとクライアントが作成されますが、サーバーエンティティは再利用されます。

サービス参照インターフェイスの代わりにClientBase<>汎用を使用することで、プロキシインターフェイスも回避できますが、サービスサイドインターフェイス(サービス契約インターフェイス)を別のアセンブリに除外して、両方のクライアントサーバー。

あなたの所見によると、エンティティのプロパティを[DataMember]としてマークしないと、そのプロパティはシリアル化されません。あなたは同じエンティティを両側から持っているので、クライアントのデフォルト値(0、nullなど)としてフィールドが出てきます。

+0

それは良い回避策であるにもかかわらず、非暴露のメンバーのためのデフォルト/ヌル値を持つことは良いプログラミングの練習ではありませんが、私はそれを見てみましょう.. –

関連する問題