考虑一个返回的方法DoSomething()
:
-
IObservable<IEnumerable<T>> DoSomething()
-
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 可能会更直观。