2009-12-08 142 views
4

我熟悉的標準庫,它有一個類似的界面:異步存儲庫Silverlight應用程序

public interface IRepository<T> 
    { 

     IEnumerable<T> All(); 

     T GetByID(int id); 

     //etc... 

    } 

我的問題涉及到在努力實現Silverlight內這種格局制約,以異步調用遠程數據訪問(這有效地從接口的方法中刪除返回值的概念)如何創建一個IAsyncRepository以及如何在返回的調用之後將數據綁定到控件的ItemSource?

回答

3

如果您想在Silverlight中使用存儲庫模式,我認爲最好的方法是將某種類型的回調方法傳遞給每個方法,然後在異步調用完成時由存儲庫調用該方法。您可以在回調函數中傳遞返回的對象,這是您可以設置數據綁定的時間。

下面的代碼是如何工作的一個例子。它不使用標準庫的模式,但我認爲你可以看到它可以被適當修改:

public void CreatedNamedRoom(string ownerUserId, string roomName, Action<Exception, Room> callback) 
    { 
     notificationClient.CreateNamedRoomAsync(ownerUserId, roomName, callback)); 
    } 

    void notificationClient_CreateNamedRoomCompleted(object sender, CreateNamedRoomCompletedEventArgs e) 
    { 
     var callback = e.UserState as Action<Exception, Room>; 
     if (callback != null) 
     { 
      callback(e.Error, e.Result); 
     } 
    } 

然後使用它是這樣的:

roomData.CreatedNamedRoom(userId, roomName, (error1, room) => 
    { 
     if (error1 == null) 
     { 
      // Setup your databinding here... 
      this.Room = room; 
     } 
    }); 

實際上,倉庫變成了用於MS讓您使用的惱人的事件驅動的異步WCF代理方法的包裝。我通常發現回調比事件更容易處理,因爲你不總是知道是什麼觸發了事件,適當維護狀態是PITA。但是,如果您將事件與可用於回調的層(上面的動作<>>)一起使用,維護適當的狀態要容易得多。

我還應該注意,假設您在後端使用類似WCF的東西,通用存儲庫可能無法與Silverlight一起使用,因爲SOAP等人不太支持泛型。更好的方法是使用存儲庫作爲基礎設施合同,如here所述。它在體系結構上更好,而且在Silverlight/WCF上效果更好。

+0

接受您的最後一段;出色的建議是將存儲庫視爲「基礎架構合同」而不是簡單的另一個DAL。感謝您的鏈接。 – gn22 2009-12-09 17:44:14