如果您想在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)
{
this.Room = room;
}
});
有效地说,仓库成为了一个包装器,用于让你使用微软提供的烦人的事件驱动异步WCF代理方法。我通常发现回调比事件更容易处理,因为你不总是知道是什么触发了事件,并且适当地维护状态是很麻烦的。但是,如果你使用可以与回调一起使用的层(上面的Action<>部分)来包装事件,则维护适当的状态会更容易。
我还应该指出,通用仓库可能无法很好地与Silverlight配合使用,假设你在后端使用类似WCF的东西,因为SOAP等不太支持通用性。更好的方法是将存储库用作基础架构契约,如
此处所述。这在架构上更好,并且与Silverlight / WCF的配合效果更好。