银光应用程序的异步仓库

4

我熟悉标准仓库,它的接口类似于:

public interface IRepository<T>
    {

         IEnumerable<T> All();

         T GetByID(int id);

         //etc...

    }

我的问题涉及在Silverlight中尝试实现此模式,它限制了远程数据访问为异步调用(这有效地从接口的方法中删除了返回值的概念)。如何创建一个IAsyncRepository并在返回调用后如何将数据绑定到控件的ItemSource?

1个回答

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;
        }
    });

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

接受您的最后一段话;非常好的建议将存储库视为“基础设施合同”,而不仅仅是另一个DAL。 谢谢链接。 - gn22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接