我正在常见的场景中工作,我希望访问存储库的子集,而不用担心必须保持更新,例如“获取价格大于 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