目前,我在 NHibernate 中发出一个数据库选择,它返回结果的 IList
。然后,我在返回的列表上使用 IList.ToObservable
来获取我可以订阅的 IObservable
。我怎样才能在响应式(Reactive)范例中编写它,而不是仅仅将列表转换为 IObservable ?
最佳答案
使用响应式扩展进行数据库调用的最佳方法就是根本不这样做。
撇开简洁的俏皮话不谈,这是一个严肃的观点。线索就在问题中...您正在进行 IO 绑定(bind)调用,因此您确实处于异步拉取情况。
C# 8 中将对此提供一流的语言支持(IAsyncEnumerable - which already has placeholders in the Rx github repo)。
但是,当您发起了一个希望得到及时响应的调用时,您确实不想将同步调用响应公开为 Observable。可观察对象适用于当您不知道数据是否或何时出现时的推送场景。您可以使查询异步,并在结果出现时以更传统的方式处理结果。
您经常在 Rx 中看到异步数据库查询,它是可观察链的一部分,该可观察链 Root 于某些合适的可观察事件,例如 UI 中的按键。按键事件被输入到一个 Observable 中,该 Observable 又转换到一个异步查询中,并弹出回 UI 中。例如:The example here有一个服务调用可以很容易地成为异步数据库查询。关键部分是 getSuggestions
异步校准的使用以及如何将其连接到可观察查询。
请注意,即使在这种情况下,服务调用本身仍然是异步拉取,不会直接返回 Observable;它是由其他一些观察到的事件启动的。
关于c# - 如何使用响应式(Reactive)扩展将同步轮询数据库查询转换为异步推送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069663/