反应式扩展中的数据服务
本文关键字:数据 服务 扩展 反应式 | 更新日期: 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"的 m1
- 创建状态为"a"的 m2
- 使用值"2"更新 m1
- 创建值为"x"的 m3
- 删除 m2
- 使用值"3"更新 m1
- 使用值"y"更新 m3
- 删除 m1
- 使用值"z"更新 m3