无功扩展中的数据服务

时间:2015-06-12 10:02:35

标签: c# system.reactive

我希望有一个用于数据处理创建,更新和删除的内存缓存的泛型类。底层模型继承自Id为string类型的接口。

interface IModel
{
  string Id { get; }
}

处理创作&更新很容易。例如,如果我想订阅流并填充一个Dictionary,我知道如果模型Id不存在则需要创建,否则它是一个更新。

我的问题是:
你如何处理删除而不引入另一个类来包装我的模型?我想保留一个IObservable<TModel>,而不是IObservable<Event<TModel>>IObservable<Pair<string, TModel>>,但我不知道如何。这可能吗?

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

1 个答案:

答案 0 :(得分:2)

由于@Enigmativity建议您可以使用嵌套的可观察序列来解决此问题。 IntroToRx的Sequences of coincidence部分已触及此内容。

这将如何运作?

您可以将嵌套序列视为二维数组,或者更具体地说是jagged array。 外部序列是内部序列的容器。 内部序列的到达表示模型的创建

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

一旦你有一个内部序列,它产生的所有值都是更新(第一个除外)。 内部序列只会为单个ID生成更新。 当内部序列完成时,代表删除

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

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

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

这将导致以下逻辑流程:

  1. 使用状态“1”
  2. 创建m1
  3. 使用'a'
  4. 状态创建m2
  5. 使用值“2”
  6. 更新m1
  7. 使用值'x'
  8. 创建m3
  9. 删除m2
  10. 使用值“3”
  11. 更新m1
  12. 使用值'y'
  13. 更新m3
  14. 删除m1
  15. 使用值'z'
  16. 更新m3