8

.NET 4.0 中 System.Reactive 库中的新 IObservable/IObserver 框架非常令人兴奋(请参阅链接和链接)。

现在推测可能还为时过早,但是否还会有一个(因为没有更好的术语)为这些新接口构建的类似 IQueryable 的框架?

一个特定的用例是协助在源头而不是在接收调用链中预处理事件。例如,如果您有一个非常“健谈”的事件接口,则使用Subscribe().Where(...)将通过管道接收所有事件并由客户端进行过滤。

我想知道是否会有类似于 IQueryableObservable 的东西,这些 LINQ 方法将被“编译”成Subscribe源中的一些“智能”实现。我可以想象某些可以使用这种框架的网络服务器架构。或者 SQL Server(或任何 RDBMS)的附加组件如何允许 .NET 代码接收新数据通知(代码中的触发器)并且需要在服务器端过滤这些通知。

4

5 回答 5

9

好吧,你在最新版本的 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 频道视频,包括对其一些设计理念的讨论。

于 2010-05-15T10:09:36.033 回答
3

虽然这听起来像是一个有趣的可能性,但我对实现它有一些保留意见。

1) 正如您不能序列化 IQueryable 使用的非平凡 lambda 表达式一样,为 Rx 序列化这些表达式同样困难。作为该框架的一部分,您可能希望能够序列化多行和语句 lambda。为此,您可能需要实现类似 Erik Meijer 的其他宠物项目 - Dryad 和 Volta。

2)即使您可以序列化这些 lambda 表达式,我也会担心在从客户端发送的服务器上运行任意代码的可能性。这很容易造成比跨站点脚本更严重的安全问题。我怀疑允许客户端将表达式发送到服务器以执行的潜在好处超过了安全漏洞的影响。

于 2009-07-30T22:09:06.943 回答
2

未来 8 年(现在 10 年):我偶然发现了Qactive(以前的 Rxx),这是一个基于Rx.Net的可查询反应式 tcp 服务器提供商它是“有问题的问题”的答案

服务器

Observable
    .Interval(TimeSpan.FromSeconds(1))
    .ServeQbservableTcp(new IPEndPoint(IPAddress.Loopback, 3205));

客户

var datasourceAddress = new IPEndPoint(IPAddress.Loopback, 3205);
var datasource = new TcpQbservableClient<long>(datasourceAddress);

(
     from value in datasource.Query()
     //The code below is actually executed on the server
     where value <= 5 || value >= 8
     select value
)
.Subscribe(Console.WriteLine);

对此令人震惊的是,客户端可以说出他们想要接收数据的内容和频率,而服务器仍然可以限制和控制它返回的时间、频率和数量。

有关此https://github.com/RxDave/Qactive的更多信息

另一个博客.sample

https://sachabarbs.wordpress.com/2016/12/23/rx-over-the-wire/

于 2017-08-02T03:15:39.870 回答
0

如果可能的话,我希望看到反应式框架解决的一个问题是启用发射和订阅以更改来自 Web 服务和其他仅拉式服务的缓存数据的通知。

于 2009-07-31T08:37:00.953 回答
0

看来,根据新的 channel9采访, .NET 4 的 BCL中将有对IObserver/的LINQ 支持。IObservable

然而,它本质上是 LINQ-to-Objects 样式的查询,所以在这个阶段,它看起来不像你所说的“智能订阅”。这就是 .NET 4 中的基本实现。(根据我对上述采访的理解)

话虽如此,响应式框架(Rx)可能有更详细的IObserver/实现IObservable,或者您可以编写自己Expression<Func...>Subscribe参数传递,然后使用表达式树Func以更智能的方式订阅,以适合事件您订阅的频道。

于 2009-08-05T02:20:33.203 回答