如果您想在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