与反应式扩展进行双向通信



让我们想象一下,我有一个热的可观测值,它是天气事件的来源。此源是与远程服务器的套接字连接,提供有关我当前位置的天气信息。

如果我发送命令来指示此愿望,该远程服务器还可以向我发送有关其他相关主题的事件,例如交通,极端天气警告等。

如何使用反应式扩展对此进行建模,而不会在可观察量和观察者之间创建耦合?

这个想法是,当我订阅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。

相关内容

  • 没有找到相关文章

最新更新