如果您想在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上效果更好。
接受您的最後一段;出色的建議是將存儲庫視爲「基礎架構合同」而不是簡單的另一個DAL。感謝您的鏈接。 – gn22 2009-12-09 17:44:14