让我们想象一下,我有一个热的可观测值,它是天气事件的来源。此源是与远程服务器的套接字连接,提供有关我当前位置的天气信息。
如果我发送命令来指示此愿望,该远程服务器还可以向我发送有关其他相关主题的事件,例如交通,极端天气警告等。
如何使用反应式扩展对此进行建模,而不会在可观察量和观察者之间创建耦合?
这个想法是,当我订阅ExtremeWeatherWarnings
(观察者)到我的WeatherServerConnection
(可观察)时,不知何故,第一个向第二个发出一些命令,因此它启用了订阅。
我尝试在观察器中实现一个特殊的接口,该接口告诉可观察对象它需要在订阅和取消订阅中执行的命令,但是当我在中间放置一个Where
时它不起作用,因为 LINQ RX 正在包装可观察量,并且该包装器不实现任何接口。
我还可以在 ExtremeWeatherWarnings
构造函数上要求 WeatherServerConnection
对象的实例,但这会产生耦合,我想避免这种情况。
干杯。
如果您的可观察量被设计为发送通用消息,而您的观察者被设计为翻译它们,那么您还需要一种方法来向生产者指示您对哪种消息感兴趣。
一种方法是"请求可观察量"。
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 的这一领域知之甚少。
这完全取决于您如何看待可观察量。
如果它是一个独立于观察者的事件流,你可以向任何想要订阅的人公开可观察量。
这就是我在反应式GeoCoordinateWatcher上遵循的方法。包装的 GeoCoordinateWatcher 类将生成独立于订阅的事件。
对于反应式地理定位器,我选择遵循相同的方法。但由于地理定位器需要参数化来生成事件,因此我本可以选择实现可观察的工厂。
底线是(如@Christopher所说)您将命令发送到公开可观察量的东西,而不是观察站本身。
您可以通过应用 Rx 运算符来执行诸如向可观察对象发送命令之类的操作。如果要远程应用这些过滤器,您可以实现(如@Christopher所说)IQbservale。