既是IObserver <t>又是IObservable <t>的类

时间:2015-08-12 04:01:48

标签: c# system.reactive

这可能对SO来说太模糊了。我需要一个类似IObserver<T>IOservable<T>的简单示例。 T实际上是同一类型。

OnNext会自行创建IOBservable<T>序列。虽然,this应该被阻止观察自己。实质上,观察者部分正在订阅多个可观察量,并聚合它们的值,然后将该聚合服务于其他订阅者。

它是继承/实现IObserver<T>IOservable<T>这么简单吗?或者我在这里以错误的方式考虑可组合性?

public struct T
{
}

public class ObserverAndObservable : IObserver<T>, IObservable<T>
{
}

我想要实现的是这样的。想象一下,我有一份oribiting卫星列表,每个卫星都归世界各国所有。我想订阅说,美国(或任何组合有用)然后计算他们的平均GPS位置。

//Satellites are constantly emiting realtime data
List<Satellite> satellites;
IOBserver<Satellite> observer = satellites.ToObservable();

IDisposable observable = observer.Where(x => string.Equals(x.Name, "USSatellite")).Subscribe();

//Now, compute the GPS average of the Satellites.

//This is not very fluent. There is probably a way to compose these
//functions using a lambda at the end to do the computation, which in turn
//can be subscribed to by other IOBservers...

2 个答案:

答案 0 :(得分:1)

您描述的模式称为Decorator模式。它不仅有效,而且绝大多数Rx.Linq都是用这种模式实现的。

关于你是否应该这样做的问题,我会说不。 Rx.Linq已经有大量的装饰器。在大多数情况下,您应该能够使用Rx.Linq方法来组合所需的装饰器,并且这些方法应该比实现更好地处理边缘情况。

Rx的意思是你可以处理功能编程范例中的事件。因此,您应该学会使用Rx.Net附带的monad,而不是尝试使用过程编程的paradime构建行为。

编辑:这是一个可以实现平均monad的示例方法。

var file = window.print();

答案 1 :(得分:-3)

从技术上讲,让单个类同时实现IObservable<T>IObserver<T>并没有错,但由于每个接口也意味着责任,这样做可能会违反single responsibility principle

我能想象的唯一一个远程有用的案例是一种“观察者代理”,但这听起来并不是很有用。