2012-02-09 11 views
2

リモートWCFサービスへの参照を介してオブジェクトを受け取るWPFクライアントアプリケーションがあります。 WCFサービス参照は、Visual Studioの[Add Service Reference ...]を介して生成されました。WCFクライアント側オブジェクトの逆シリアル化通知

オブジェクトがWCFサービスから受信/非直列化されるたびにコードを実行したいと思います。私はプロパティ/それを呼び出すメソッドを読むことができるように、オブジェクトをデシリアライズする必要があります。このソリューションはグローバルであり、すべてのWCFサービスコールに追加する必要はありません。

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.aspx

+0

質問が分かりません。誰かがこれをやったところでコードサンプルを探していますか?あなたの意図がより具体的になりますか? –

+0

私は可能な限り一般的な質問をしたいと思った。私は、WCFワークフロー(どこかの属性?動作?)にフックできる場所についてのガイダンスを探しています。具体的には、システムに入る各オブジェクトのINotifyPropertyChanged.PropertyChangedイベントを購読したいので、ユーザーによって変更されました。 –

+0

私は参照してください。マイクの答えを見てください...それはあなたが探しているものかもしれません。 –

答えて

4

私は、次の解決策を考え出すことができたマイクの初期応答を皮切り:

+0

カスタムシリアルライザー/デシリアライザを作成することができます。実用的な解決策です。あなたがサービスを自己ホストしていれば、Application.Currentはまだnullでしょうか? –

3

あなたがOnDeserialized属性を使用することができます。

背景

  1. クライアントは、WCFサービスを介して、サーバーからデータを取得します。
  2. WCFサービス参照はVisual Studioによって "参照されたアセンブリ内の再利用タイプ"によって生成されるため、WCFプロキシ操作は実行できません。
  3. クライアント側アプリケーションのプロパティは、オブジェクトのいずれかの任意のプロパティは、変更されたWCFから受信した場合(これらのオブジェクトはINotifyPropertyChangedのを実装する)

事前警告

私は理解変更する必要がありますこれはいくつかのオブジェクト指向と責任のルールを破りますが、ソリューションはとても短く、簡単で、私の現在および将来のニーズに適合しています。このソリューションは、各クライアント側のデシリアライズ時に発生する必要がある重要なロジックがある場合、あまり実用的ではありません。

[DataContract] 
public class DataTransferObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 
     dynamic app = Application.Current; 
     if(app != null) //Prevents execution on server-side. This code is meant to only execute at the client 
     { 
      PropertyChanged += (sender, args) => 
            { 
             app.IsAnythingDirty = true; 
            }; 
     } 
    } 
} 

キー

  1. この作品の理由は、動的なキーワードです。 動的キーワードを使用する必要があります。DTOを含むプロジェクトは循環参照のために UIプロジェクトを参照できないためです。 UIプロジェクトを参照できない場合、コンパイラはIsAnythingDirtyブール値を認識しません。
  2. Application.Currentがnullであるかどうかを確認すると、コードはサーバー側ではなくクライアント側でのみ実行されます。
+0

これは私が探しているものに近いですが、ワイヤ上で送信されているタイプにコードを配置する必要があります(私は参照されたアセンブリの再利用タイプを使用しています)。コードがこの共有コードにある場合、WPF /クライアントアプリケーション内の情報にアクセスすることはできません。 –

+0

あなたはサービスコードとクライアントを管理していますか?データ転送オブジェクト(およびコントラクト)を独自のアセンブリに配置し、Visual Studioで[サービス参照の追加]を使用するのではなく、クライアントで直接参照することができます。あなたはそれを使用してクライアント設定を生成することができます(これはしばしばエラーが起こりやすい)。参照されたアセンブリのContract型でChannelFactoryを使用します。 –

+0

サービスコードにアクセスできない場合は、サービス参照の追加を使用してプロキシクラスを生成し、独自のクラスにコードを貼り付け、非直列化イベントを処理する関連メソッドを追加することができます。 –

関連する問題