小编Wil*_*ans的帖子

使用 Rx 构建可观察存储库

我正在常见的场景中工作,我希望访问存储库的子集,而不用担心必须保持更新,例如“获取价格大于 10 的所有订单”。我已经实现了一个解决方案,但有两个问题(列在最后)。

存储库的子集可以通过相当于的东西来实现

var expensiveOrders = Repository.GetOrders().Where(o => o.Price > 10);

但这是一个IEnumerable,不会在原始集合更新时更新。我可以添加 的处理程序CollectionChanged,但如果我们想访问更多子集怎么办?

var expensiveOrdersFromBob = expensiveOrders.Where(o => o.Name == Bob);
Run Code Online (Sandbox Code Playgroud)

我们还必须连接一个集合 - 也为这个集合进行了更改。实时更新的概念让我想到了 Rx,因此我开始构建一个ObservableCache,其中包含ObservableCollection自动更新的项目和用于通知的 RX 流。(该流也是在底层更新缓存的内容。)

class ObservableCache<T> : IObservableCache<T>
{
    private readonly ObservableCollection<T> _cache;
    private readonly IObservable<Tuple<T, CRUDOperationType>> _updates;

    public ObservableCache(IEnumerable<T> initialCache
       , IObservable<Tuple<T, CRUDOperationType>> currentStream, Func<T, bool> filter)
        {
          _cache = new ObservableCollection<T>(initialCache.Where(filter));
          _updates = currentStream.Where(tuple => filter(tuple.Item1));
          _updates.Subscribe(ProcessUpdate);
        }

    private void ProcessUpdate(Tuple<T, CRUDOperationType> update)
    {
        var item …
Run Code Online (Sandbox Code Playgroud)

c# repository observablecollection reactive-programming system.reactive

5
推荐指数
1
解决办法
2423
查看次数