反应式扩展中的数据服务

本文关键字:数据 服务 扩展 反应式 | 更新日期: 2023-09-27 17:55:32

我想有一个通用类,用于处理创建、更新和删除的数据存储的内存缓存。基础模型继承自 Id 类型为字符串的接口。

interface IModel
{
  string Id { get; }
}

处理创建和更新很容易。例如,如果我想订阅流并填充字典,我知道如果模型 ID 尚不存在,则需要创建,否则它是更新。

我的问题是:
如何在不引入另一个类来包装我的模型的情况下处理删除?我想保持IObservable<TModel>,而不是像IObservable<Event<TModel>>IObservable<Pair<string, TModel>>这样的东西,但我看不出如何。这可能吗?

interface IDataService<TModel>
{
  IObservable<TModel> DataStream { get; }
}

反应式扩展中的数据服务

正如@Enigmativity建议的那样,您可以使用嵌套的可观察序列来解决此问题。这在IntroToRx的巧合序列部分中有所涉及。

这将如何工作?

您可以将嵌套序列视为类似于 2d 数组的东西,或者更具体地说是交错数组。外部序列是内部序列的容器。内部序列的到来表示模型的创建

interface IDataService<TModel>
{
    IObservable<IObservable<TModel>> DataStream { get; }
}

一旦你有一个内部序列,它产生的所有值都是更新的(第一个除外)。内部序列将仅生成单个 id 的更新。当内部序列完成时,表示删除

此模式适用于各种用例,如上面链接的初始段落所述。

作为大理石图,您将拥有如下所示的内容。每行代表一个内部序列。

m1  1---2----3--|
m2     a----|
m3       x----y---z--

这将导致以下逻辑流:

  1. 创建状态为"1"的 m1
  2. 创建状态为"a"的 m2
  3. 使用值"2"更新 m1
  4. 创建值为"x"的 m3
  5. 删除 m2
  6. 使用值"3"更新 m1
  7. 使用值"y"更新 m3
  8. 删除 m1
  9. 使用值"z"更新 m3