2009-12-08 94 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