编程语言
首页 > 编程语言> > c# – MVVM和异步数据访问

c# – MVVM和异步数据访问

作者:互联网

所以我有一个使用MVVM模式的WPF应用程序(Caliburn.Micro).我得到了视图和视图模型的连接,基本上缺少的是数据.数据将从WCF服务,本地存储或内存/缓存“按需”检索 – 原因是允许脱机模式并避免不必要的服务器通信.另一个要求是异步检索数据,因此不会阻止UI线程.

所以我想创建一些视图模型用来请求数据的“AssetManager”:

_someAssetManager.GetSomeSpecificAsset(assetId, OnGetSomeSpecificAssetCompleted)

请注意,它是异步调用.我遇到了一些不同的问题.如果不同的视图模型(大致)同时请求相同的资产,我们如何确保我们不做不必要的工作,并且他们都获得了我们可以绑定的相同对象?

不确定我是否采取了正确的方法.我一直在看一下Reactive Framework – 但我不知道如何在这种情况下使用它.关于我可以使用的框架/技术/模式的任何建议?这似乎是一种相当常见的情况.

解决方法:

Dictionary<int, IObservable<IAsset>> inflightRequests;

public IObservable<IAsset> GetSomeAsset(int id)
{
    // People who ask for an inflight request just get the
    // existing one
    lock(inflightRequests) {
        if inflightRequests.ContainsKey(id) {
            return inflightRequests[id];
        }
    }

    // Create a new IObservable and put in the dictionary
    lock(inflightRequests) { inflightRequests[id] = ret; }

    // Actually do the request and "play it" onto the Subject. 
    var ret = new AsyncSubject<IAsset>();
    GetSomeAssetForReals(id, result => {
        ret.OnNext(id);
        ret.OnCompleted();

        // We're not inflight anymore, remove the item
        lock(inflightRequests) { inflightRequests.Remove(id); }
    })

    return ret;
}

标签:c,mvvm,wpf,system-reactive,caliburn-micro
来源: https://codeday.me/bug/20190613/1233666.html