2012-03-22 53 views
0

我很新,Silverlight和WCF Ria服務。我有WPF和WinForms背景經驗。從其他項目消費WCF

現在我正在開發一個基本上由Web頁面獲取遠程服務器數據的Silverlight應用程序。

我讀過大量的論壇和文章,解釋如何使用和使用Web服務和WCF。我遵循msdn walkthrough關於如何創建一個從數據庫獲取數據的簡單應用程序,它運行良好。

問題是我不想在我的UI控件中使用任何與WCF相關的代碼或資源。 現在我使用的分層編程架構:

UI - > BLL - > DAL

每個元素是相同的解決方案的單一項目。我的DAL項目是與服務器通信的Web服務(WCF Ria)。

我有一個簡單的類(用戶服務)和方法(GetUsers)在我的DAL項目,下面的代碼:

 LoadOperation<u_WEBUSERS> loadOp = this.userContext.Load(this.userContext.GetU_WEBUSERSQuery()); 
     loadOp.Completed += (sender, args) => 
     { 
      users = new List<UserObj>(); 
      foreach (var v in loadOp.Entities) 
      { 
       u_WEBUSERS uweb = v as u_WEBUSERS; 
       UserObj u = new UserObj(); 

       u.Nome = uweb.nome; 
       u.Morada = uweb.morada; 
       users.Add(u); 
      } 
     }; 
     return users; 

的事情是,我的用戶對象,則返回NULL。如果我斷點,我看到第一個結束該方法,只有在調用完成的事件後。

有沒有辦法讓我的GetUsers()返回數據庫信息? 也許我使用分層achitecture不是一個適合我想要的東西...... 感謝

回答

1

您可以使用簡單的ActionAction<T>代表:

public void LoadUsers(Action<IEnumerable<UserObj>> callBack) 
{ 
    LoadOperation<u_WEBUSERS> loadOp = this.userContext.Load(this.userContext.GetU_WEBUSERSQuery()); 
    loadOp.Completed += (sender, args) => 
    { 
     users = new List<UserObj>(); 
     foreach (var v in loadOp.Entities) 
     { 
      u_WEBUSERS uweb = v as u_WEBUSERS; 
      UserObj u = new UserObj(); 

      u.Nome = uweb.nome; 
      u.Morada = uweb.morada; 
      users.Add(u); 
     } 
     if(callBack != null) 
      callBack(users); 
    }; 
} 
+0

謝謝。它工作完美。我幾乎放棄了希望。我從來沒有想過使用Action delgates。非常感謝 – David 2012-03-23 12:52:44

0

你一起混合同步和異步代碼。您正在設置已完成的事件,但在您未指定處理程序時,該調用纔會返回,直到它完成爲止。請參閱example here。所以,你的代碼將是:

LoadOperation<u_WEBUSERS> loadOp = this.userContext.Load(this.userContext.GetU_WEBUSERSQuery()); 
users = new List<UserObj>(); 
foreach (var v in loadOp.Entities) 
{ 
    u_WEBUSERS uweb = v as u_WEBUSERS; 
    UserObj u = new UserObj(); 

    u.Nome = uweb.nome; 
    u.Morada = uweb.morada; 
    users.Add(u); 
} 
return users; 
+0

很抱歉,但它只是不工作。我的用戶對象總是返回沒有內容。 – David 2012-03-23 12:53:22