好吧,你在最新版本的 Rx 中得到了它,以一个名为IQbservable(发音为 IQueryableObservable)的接口的形式。请继续关注有关该主题的第 9 频道视频,该视频将于下周初播出。
为了稍微定位这个特性,人们应该意识到 Rx/Ix 难题在概念上存在三个正交轴:
- 您的目标是什么数据模型。在这里,我们发现基于拉的模型与基于推的模型。他们的关系是基于二元性的。这些世界之间存在转换(例如 ToEnumerable)。
- 在哪里执行驱动查询的操作(sensu lato)。某些运算符需要并发性。这就是调度和 IScheduler 接口发挥作用的地方。操作员的存在是为了在并发域之间跳跃(例如 ObserveOn)。
- 查询表达式需要如何执行。逐字记录 (IL) 或可翻译(表达式树)。他们的关系是基于同音性的。两种表示之间存在转换(例如 AsQueryable)。
所有 IQbservable 接口(它是 IQueryable 和 IObservable 查询的表达式树表示的对偶)启用是最后一点。有时人们会混淆查询翻译的行为(“如何”运行)和远程处理(“在哪里”运行)。虽然通常您确实将查询翻译成某种目标语言(例如 WQL、PowerShell、用于云通知服务的 DSQL 等)并将它们远程传输到某个目标系统中,但这两个问题都可以解耦。例如,您可以使用表达式树表示来进行本地查询优化。
关于可能的安全问题,这与 IQueryable 功能没有什么不同。通常,一个人只会远程表达语言,而不是任何“真正的副作用”运算符(无论这对于原教旨主义功能性语言以外的语言意味着什么)。特别是,Subscribe 和 Run 操作保持在本地,并将您带出可查询的 monad(因此触发翻译,就像 GetEnumerator 在 IQueryable 的世界中所做的那样)。你如何远程订阅的行为是我将留给读者想象的事情。
今天就开始玩最新的游戏,让我们知道您的想法。还请继续关注即将发布的有关此新功能的第 9 频道视频,包括对其一些设计理念的讨论。