让我们想象一下,我有一个可以观察到的热点,这是天气事件的一个来源。此源是与远程服务器的套接字连接,该服务器提供有关当前位置天气的信息。
远程服务器还可以向我发送有关其他相关主题的事件,如交通、极端天气警告等。如果我发出命令来表示这个愿望。
我如何在不创建可观察到的和观察者之间的耦合的情况下用反应性扩展来建模呢?
其思想是,当我订阅ExtremeWeatherWarnings (观察者)到我的WeatherServerConnection (可观察的)时,第一种方式是向第二种发出一些命令,所以它允许订阅。
我尝试在观察者中实现一个特殊的接口,它告诉可观察到的用户在订阅和取消订阅中执行哪些命令,但是在我将Where放在中间时,它无法工作,因为LINQ正在包装可观察到的接口,而该包装器没有实现任何接口。
我还可以在WeatherServerConnection构造函数上要求ExtremeWeatherWarnings对象的一个实例,但这将创建耦合,我想避免这种情况。
干杯。
发布于 2014-03-31 20:47:37
如果您的可观察对象是设计用来发送通用消息的,而您的观察者是用来翻译它们的,那么您还需要一种方法来向生产者指示您感兴趣的消息类型。
这样做的一种方法是“请求一个可观察的”。
ObservableWeatherSource GetNotifications(WeatherWarnings warningTypes, string location);另一种方法可能是懒洋洋地指出您感兴趣的通知。
ObservableWeatherSource source = GetWeatherSource();
source
.Where(x => x.WeatherWarningType === WeatherWarnings.Rain)
.Subscribe(new WeatherObserver());
source.ExpressInterestIn(WeatherWarnings.Rain, "San Francisco");或者,您可能对编写专门的天气查询语言感兴趣。您可能可以通过IQbservable和查询提供程序来完成这一任务,但我对Rx的这一领域知之甚少。
发布于 2014-04-01 07:53:41
这完全取决于你如何看待你的观察结果。
如果这是一个独立于观察者之外的事件流,您只需向任何想订阅的人公开可观察到的事件。
这就是我在反应性GeoCoordinateWatcher上遵循的方法。包装好的GeoCoordinateWatcher类将生成独立于订阅的事件。
对于反应型地质体,我选择了相同的方法。但是因为地学仪需要参数化来产生事件,所以我可以选择实现一个可观察的工厂。
底线是(正如@Christopher所说),将命令发送到一些可以观察到的东西,而不是向观察本身发送命令。
您可以通过应用Rx运算符向可观察的对象发送命令。如果要远程应用这些过滤器,您可以实现(正如@Christopher所说的)一个IQbservale。
https://stackoverflow.com/questions/22762271
复制相似问题