假设我有一个热观测站,它是天气事件的来源。此源是到远程服务器的套接字连接,该服务器提供有关我当前位置的天气的信息。
如果我发送命令指示这种愿望,则该远程服务器还可以向我发送有关其他相关主题的事件,例如交通,极端天气警告等。
如何在不创建可观察者与观察者之间的耦合的情况下使用反应性扩展对此建模?
这个想法是,当我将ExtremeWeatherWarnings
(观察者)订阅到我的WeatherServerConnection
(可观察)时,第一个以某种方式向第二个发出了一些命令,因此它启用了订阅。
我尝试在观察器中实现一个特殊的接口,该接口告诉可观察的对象它需要在订阅和取消订阅中执行的命令,但是由于我将Where
放在中间,因此它无法正常工作,因为LINQ RX包装了可观察到的,并且该包装器未实现任何接口。
我还可以在WeatherServerConnection
构造函数上要求ExtremeWeatherWarnings
对象的实例,但这会产生耦合,我想避免这种情况。
干杯。
最佳答案
如果您的可观察对象旨在发送通用消息,而您的观察者则旨在翻译它们,则您还需要一种方法来向生产者表明您对哪种消息感兴趣。
一种方法是“请求可观察的”。
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的这一领域一无所知。