C# 反应式扩展中的数据服务

C# 反应式扩展中的数据服务,c#,system.reactive,C#,System.reactive,我希望有一个通用类,用于处理创建、更新和删除的数据的内存缓存。基础模型继承自Id为string类型的接口 interface IModel { string Id { get; } } 处理创建和更新很容易。例如,如果我想订阅流并填充字典,我知道如果模型Id不在那里,则需要创建,否则这是一个更新 我的问题是: 如果不引入另一个类来包装我的模型,您将如何处理删除操作?我想保留一个IObservable,而不是像IObservable或IObservable这样的东西,但我不知道如何保存。可能

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

interface IModel
{
  string Id { get; }
}
处理创建和更新很容易。例如,如果我想订阅流并填充字典,我知道如果模型Id不在那里,则需要创建,否则这是一个更新

我的问题是:
如果不引入另一个类来包装我的模型,您将如何处理删除操作?我想保留一个
IObservable
,而不是像
IObservable
IObservable
这样的东西,但我不知道如何保存。可能吗

interface IDataService<TModel>
{
  IObservable<TModel> DataStream { get; }
}
接口IDataService
{
IObservable数据流{get;}
}

正如@Enigmativity所建议的,您可以使用嵌套的可观察序列来解决这个问题。 这一点将在介绍中的一节中介绍

这是怎么回事? 您可以将嵌套序列想象成类似于二维数组的东西,或者更具体地说是一个数组。 外部序列是内部序列的容器。 内部序列的到达表示模型的创建

interface IDataService<TModel>
{
    IObservable<IObservable<TModel>> DataStream { get; }
}
这将导致以下逻辑流:

  • 创建状态为“1”的m1
  • 创建状态为“a”的m2
  • 使用值“2”更新m1
  • 创建值为“x”的m3
  • 删除m2
  • 使用值“3”更新m1
  • 使用值“y”更新m3
  • 删除m1
  • 使用值“z”更新m3

  • 您可以使用
    IObservable
    创建嵌套流,以便在每个内部流结束时删除在内部流上添加/更新的任何模型。听起来很有趣,我没有想到这一点。我不确定它在使用上有多方便,以及它会给实现增加多少开销。我试试看。你只限于一条流吗?或者您可以有多个?您是否建议为每个操作创建单独的流?或者至少用一个来删除?听起来也不错!第一个,您将有类似于
    ItemChanged
    itemsadded
    itemsdeleted
    。如果你真的想,你可以将添加和更改结合起来,但我喜欢将关注点分开,这样消费者就不必总是担心他们以前是否见过某个项目。很抱歉,回复太晚,我不得不换到另一个话题。我想知道当这个dataservice流绑定到UI时,如何执行缓冲/窗口处理?你有什么提示吗?在这种情况下,IOB似乎不方便,对吧?这是两个不同的问题。首先解决你的建模问题。我建议使用嵌套的可观察序列来实现这一点。一旦您解决了建模问题,那么您就有了保持UI响应性的单独问题。在独立查询中将其分解为。
    m1  1---2----3--|
    m2     a----|
    m3       x----y---z--