IObservable会有类似IQueryable的添加吗? (.NET Rx)

问题描述 投票:8回答:5

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

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

一个特定的用例是协助在源处预处理事件,而不是在接收呼叫的链中。例如,如果你有一个非常'chatty'事件接口,使用Subscribe().Where(...)将通过管道接收所有事件,客户端进行过滤。

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

linq system.reactive
5个回答
9
投票

好吧,你在最新版本的Rx中得到了它,它是一个名为IQbservable的接口(发音为IQueryableObservable)。请继续关注这个主题的第9频道视频,该视频将于下周初发布。

为了稍微调整这个特征,人们应该意识到概念上有三个正交轴到Rx / Ix拼图:

  • 您要定位的数据模型是什么。在这里,我们发现基于拉式和基于推的模型。他们的关系基于二元性。这些世界之间存在变换(例如ToEnumerable)。
  • 在哪里执行驱动查询的操作(sensu lato)。某些运营商需要并发。这就是调度和IScheduler接口的用武之地。运营商的存在是为了在并发域之间跳转(例如ObserveOn)。
  • 查询表达式如何执行。逐字(IL)或可翻译(表达树)。他们的关系基于同质性。两种表示之间存在转换(例如,AsQueryable)。

所有IQbservable接口(对于IQueryable的双重接口和IObservable查询的表达式树表示)都是最后一点。有时候人们会混淆查询翻译的行为(“如何”运行)与远程方面(“运行的地方”)。虽然通常您会将查询转换为某种目标语言(例如WQL,PowerShell,用于云通知服务的DSQL等)并将它们远程转移到某个目标系统,但这两种关注点都可以解耦。例如,您可以使用表达式树表示来执行本地查询优化。

关于可能的安全问题,这与IQueryable功能没有什么不同。通常只会远程使用表达式语言,而不是任何“真正的副作用”运算符(无论对于除了原教旨主义功能的语言以外的其他语言)。特别是,订阅和运行操作保持在本地并将您带出可查询的monad(因此触发转换,就像GetEnumerator在IQueryable的世界中所做的那样)。如何远程订阅行为是我留给读者想象的东西。

今天开始玩latest bits,让我们知道你的想法。同时请继续关注即将推出的关于这一新功能的第9频道视频,包括对其部分设计理念的讨论。


3
投票

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

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

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


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的更多信息

另一个blog.sample

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


0
投票

如果可能的话,我希望通过Reactive Framework解决的一个问题是启用排放和订阅来更改来自Web服务和其他只读服务的缓存数据的通知。


0
投票

看来,基于一个新的channel9 interview,在.NET 4的BCL中将有qqxswpoi / IObserver的LINQ支持。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.