2012-02-09 59 views
2

我有一個WPF客戶端應用程序通過對遠程WCF服務的引用接收對象。 WCF服務引用是通過Visual Studio的「添加服務引用...」生成的。WCF客戶端對象反序列化通知

我想每次從WCF服務接收/反序列化一個對象時執行一段代碼。該對象需要已經被反序列化,所以我可以讀取它的屬性/調用方法。此解決方案將是全局的,而不是我需要添加到每個WCF服務調用的東西。

+0

我不明白這個問題。您是否正在尋找代碼示例,如果有人這樣做?你能更明確地表達你的意圖嗎? – 2012-02-09 21:23:51

+0

我想讓問題儘可能通用。我正在尋找關於哪裏可以掛鉤到WCF工作流中的指導(某個地方的行爲屬性)。具體而言,我想訂閱進入系統的每個對象的INotifyPropertyChanged.PropertyChanged事件,以便我可以確定是否有任何傳入對象已被用戶修改。 – 2012-02-09 21:26:50

+0

我明白了。看看邁克的回答......它可能正是你想要的。 – 2012-02-09 21:28:21

回答

4

與邁克的初步反應,我能夠想出以下解決方案開始。

背景

  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是否爲空可確保代碼僅在客戶端運行,而不在服務器端運行。
+0

看起來像一個很好的,務實的解決方案給我。如果您自己託管該服務,Application.Current仍然爲空? – 2012-02-10 17:18:04

3
+0

這與我正在尋找的東西很接近,但需要將代碼放置在通過網線發送的類型中(我正在使用「在引用的程序集中重用類型」)。如果代碼位於此共享代碼中,則無法訪問我的WPF /客戶端應用程序中的任何信息。 – 2012-02-09 21:36:58

+0

您是否在控制服務代碼以及客戶端?如果是這樣,您可以將數據傳輸對象(和契約)放置在它們自己的程序集中,並直接在客戶端上引用它,而不是在Visual Studio中使用「添加服務引用」。你可以使用它來生成客戶端配置(這通常有點容易出錯)。但隨後將ChannelFactory與引用程序集中的合同類型一起使用。 – 2012-02-09 21:44:09

+0

或者如果您無法訪問服務代碼,則可以使用添加服務引用來生成代理類,然後將代碼粘貼到您自己的類中,並添加相關方法來處理反序列化事件。 – 2012-02-09 21:45:06

相關問題