IObservable<IEnumerable<T>>真的应该是一个IObservable<T>吗?



考虑一个返回的方法DoSomething()

  1. IObservable<IEnumerable<T>> DoSomething()
  2. IObservable<T> DoSomething()

同时考虑:

  • 该方法是否应该将 IEnumerable 平面映射到 IObservable?
  • 是否应该让消费者为所欲为?
  • 一种方式还是另一种方式更正确
  • 无论哪种方式都重要吗,您的消费者真的应该为所欲为,退回的意图是相同的?

考虑这个Observable.Buffer扩展方法的签名:

IObservable<IList<TSource>> Buffer<TSource>(IObservable<TSource> source, int count)

显然,如果将结果平坦化为IObservable<TSource>,那将不是很有用。

正如你自己所说,IObservable<T>IObservable<IEnumerable<T>>在概念上是不同的。

IObservable<IEnumerable<T>>在语义上确实与IObservable<T>不同。

IObservable<IEnumerable<T>>表示报告零个或多个值的零个或多个时刻。

IObservable<T>表示报告单个值的零个或多个时刻。

然后,前者可用于表示时间点之间的活动,返回空枚举将正表示自最后一个值以来的零活动。后者不能明确地这样做。

因此,这两种形式可用于表示两种不同的实际方式或报告值。

如果这就是

您的方法的含义,那么返回IObservable<IEnumerable<T>>并没有错。缓冲区是有意义的一个例子 - 任何带有批处理的东西都是有意义的。如果您的服务接受批量订单请求,则IObservable<IEnumerable<Order>>可能有效。您可以将其展平,这也可能是有效的。

这取决于批处理/缓冲区本身的概念是否是方法应该执行的操作的组成部分。如果您的方法恰好使用缓冲区来实现其目标,但该方法本质上不是批处理操作,那么扁平化 Observable 可能会更直观。

相关内容

  • 没有找到相关文章