【问题标题】:Data service in Reactive Extension反应式扩展中的数据服务
【发布时间】:2015-06-12 10:02:34
【问题描述】:

我想要一个通用类来处理数据处理创建、更新和删除的内存缓存。底层模型继承自一个 Id 类型为字符串的接口。

interface IModel
{
  string Id { get; }
}

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

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

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

【问题讨论】:

  • 您可以使用IObservable&lt;IObservable&lt;TModel&gt;&gt; 创建嵌套流,以便在每个内部流结束时删除在内部流上添加/更新的任何模型。
  • 听起来很有趣,我没想到。我不确定它在使用中会有多方便,以及它会给实现增加多少开销。我会试一试的。
  • 您是否仅限于一个流?或者你可以有多个?
  • 您是否建议为每个操作创建单独的流?或者至少专门用于删除?听起来也不错!
  • 第一个,所以你会有ItemChangedItemAddedItemDeleted之类的东西。如果您真的需要,您可以合并添加和更改,但我喜欢通过拆分关注点来分离关注点,这样消费者就不必总是担心他们之前是否看过某个项目。

标签: c# system.reactive


【解决方案1】:

正如@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' 的 m1
  2. 创建状态为“a”的 m2
  3. 使用值“2”更新 m1
  4. 创建值为“x”的 m3
  5. 删除平方米
  6. 使用值“3”更新 m1
  7. 使用值“y”更新 m3
  8. 删除m1
  9. 使用值“z”更新 m3

【讨论】:

  • 抱歉回复晚了,我不得不切换到另一个话题。我想知道当这个数据服务流绑定到 UI 时如何执行缓冲/窗口化?你有什么提示吗?看起来 IObs> 在那种情况下不方便吧?
  • 这是两个独立的问题。 1st解决您的建模问题。我建议使用嵌套的可观察序列来做到这一点。一旦你解决了你的建模问题,那么你就有了保持 UI 响应的单独问题。将其分解为独立查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2011-08-27
  • 2012-01-15
相关资源
最近更新 更多