2010-11-04 34 views
2

我正在使用來自Silverlight應用程序(MVVM)和Windows Phone的WCF服務。我有一個服務類(自動生成)和一個IServiceRepository如下所示用於調用服務的IService接口。每種方法一個代理或全局級別代理

public interface IServiceRepository 
{ 
    event EventHandler<SomeEventArgs> GetDataCompleted; 
    void Data GetData(); 
    // 10 more methods for fetching different data. 
} 

我SerViceRepository如下所示

public class ServiceRepository : IServiceRepository 
    { 
     public event EventHandler<SomeEventArgs> GetDataCompleted; 

     public void Data GetData() 
     { 
      var proxy = new ActualServiceRefClient(); 
      proxy.GetDataCompleted += PrivateGetDataCompleted; 
      proy.GetDatAsync(); 
     } 

     private void PrivateGetDataCompleted(object s, SomeEventArgs e) 
     { 
     // Error check and all 
     if(GetDataCompleted != null) 
      GetDataCompleted(this, new SomeEventArgs(...)); 
     } 
    } 

我打電話從我的ViewModels這個方法。現在,我的問題是...

  1. 現在我創建代理 類,並在每一個方法來連接事件處理 它。我應該在 ServiceRepository的構造函數中做 嗎?正如我所說我有 約10至12服務方法 調用。
  2. 我應該註銷已完成方法中的事件處理程序嗎?

回答

2
  1. 我不知道它的問題,哪裏就有奇蹟。如果你只有一個你正在調用的實際服務方法,把事件接線放在構造函數中是有道理的。如果您的服務存儲庫中的10個數據方法中的每一個都有一個實際的服務方法,那麼將它們連接到10-12個單獨的方法中的每個方法會更有意義。

  2. 這取決於。如果您要保留一個Service Repository的實例,並對其進行多次調用,那麼您應該將事件接線移至構造函數,或者確保在每次調用時不重新連線事件處理函數。或者,您可以像您說的那樣取消註冊,但我認爲最好在對象的整個生命週期內註冊這些事件處理程序一次。如果您只是爲每個罐創建服務存儲庫的新實例,則無需註銷事件處理程序。

希望這有助於!

+0

問題是我有大約15個服務方法等15個​​事件要註冊。我的每個視圖模型都調用兩個或三個服務方法。通常情況下,如果我終身離開事件處理程序不成問題,但在Windows Phone 7中,最大峯值內存爲90 Mb,我們擔心內存問題 – Tanmoy 2010-11-09 08:26:08

+1

我想我會在每次需要時實例化服務存儲庫,每個單獨方法中的事件處理程序。讓服務庫超出範圍,垃圾收集器將回收內存。 – 2010-11-09 14:06:11

+0

謝謝。我想這是使用MVC和LINQ datacontext的方式。雖然我找不到鏈接 – Tanmoy 2010-11-12 23:45:22