Reactive Extensions ... CRUD应用程序中的示例

时间:2011-09-22 09:30:03

标签: c# crud system.reactive

我刚刚接触到Reactive Extensions,但仍然没有那个“A-Ha”时刻,那一切似乎都适合了。因此,我需要一些帮助,并想知道在简单的CRUD程序中,反应式扩展可能具有哪种角色。

有没有人有任何关于RX扩展如何帮助他们的CRUD应用程序的例子。你可以想象我正在用C#编写一个CRUD应用程序...任何例子都被接受了,这个被发布以便我可以考虑RX如何适合我正在进行的编程类型。

也许您可以列出编程任务如何从RX中受益以及在使用RX之前如何完成任务。

6 个答案:

答案 0 :(得分:2)

我做过这种运作良好的事情:

public interface IStorage : IDisposable
{
    IObservable<int> GetOperationsCount(IScheduler scheduler);

    IObservable<Node> FetchNodes(IObservable<NodeId> nodeIds, IScheduler scheduler);
    IObservable<Node> StoreNodes(IObservable<Node> nodes, IScheduler scheduler);
}

它允许我在后台线程上执行提取和存储,并且很容易在UI线程上返回值。

每次调用StoreNodes也会设置一个事务,我可以从return observable中获取任何错误。

我还使用GetOperationsCount observable向用户显示待处理操作的数量等。

我对Rx的个人经验让我想要将它用于任何异步 - 事件,开始/结束调用,异步,任务,线程等。它使一切都适合一个模型,并且可以成为重要的代码保护程序

答案 1 :(得分:0)

如果你做静态CRUD(获得一个带有创建,读取,更新,写入等的窗口/对话框),那么我想它可能只对你的UI有所帮助。例如,您可能想要某种输入的某种AutoCompletion。或者您必须查询服务以显示其他信息。 那么RX可以帮助你做到这一点。它将隐藏许多异步相关的困难,并为您提供易读且易于阅读且可快速执行的可读表达式。 从这个意义上讲,它仅与UI / async

的LINQ相同

答案 2 :(得分:0)

典型的CRUD应用程序有一些UI(winform,WPF等)和数据存储来获取数据并在UI中显示。这两个组件(UI和数据存储)之间的数据流可以使用Rx建模。

使用Rx我们可以连接2个组件(UI和数据存储),例如: UI可以为Create,Update和Delete公开3个observable(例如:在构造函数中传递给数据存储)。例如:可以映射Submit按钮事件以生成Create observable值,类似于Update和delete。所以基本上数据存储需要订阅这3个可观察数据并且不需要打扰如何生成数据(这也有助于UT,因为你可以轻松地创建虚假的observable)。

读取将是一种简单的数据存储读取方法,因为它是关于按需提取数据。

所以基本上Rx作为一个抽象来组成2个组件。

答案 3 :(得分:0)

也许我错了,考虑两个答案。 MS倾向于将他们的商业分成多层,因为他们对此感兴趣。

CRUD是物理实现 - 创建 - 读取 - ... 但对于用户来说,UI似乎是合乎逻辑的 - 在上下文中......

有时您需要一个图层 - 业务层 - 控制进出RDMS的流量。 Imo这非常复杂。

在财务业务中,“更新”或“删除”操作是使用新时间戳复制当前行。 这使得很难进行清洁操作 - 至少是物理... 除此之外,您可能会认为CRUD只是交易的一部分 - 在一切正常之前制作“逻辑工作单元” - 然后您应该执行COMMIT。

希望这会有所帮助......

答案 4 :(得分:0)

CRUD应用程序将具有某种搜索功能。您可以使用“类型并等待搜索”实现文本框搜索,就像我最近在我的博客上写的演示一样:

http://blog.andrei.rinea.ro/2013/06/01/bing-it-on-reactive-extensions-story-code-and-slides/

基本上使用Throttle和其他Reactive Extensions,您可以创建快速搜索功能。

答案 5 :(得分:0)

Rx非常适合收藏。现在,我无法想象使用不具有类似LINQ功能的语言。

最近,对于Rx来说,它变得相同,主要是因为使用了Rx来执行LINQ的库:DynamicData

text_boxes

基本上,您可以创建类似LINQ的查询,这些查询在进行任何更改后都会动态刷新自身-源列表中的新项(仅DTO就足够了!),某些属性更改,来自其他地方的信号(传递为可观察的),等等。< / p>

您要显示带有标志的实体数量吗?一支班轮。

您要根据用户选择的属性轻松显示动态组吗?一支班轮。

您要分页吗? 3行:P

此外,还有一个名为ReactiveUI的MVVM框架-它为您提供了ReactiveCommand和更多技巧。

其中包括绑定框架和基于lambda的转换器,能够在View中对VM中发生的非常特定的事件做出反应,管理View模型的激活(例如初始命令执行,但不在构造函数中)。

您是否希望仅在用户名和密码不为空时才启用登录按钮?

    (x, y, w, h) = box

您可以执行以下操作:

x = box["x"]
y = box["y"]
w = box["w"]
h = box["h"]

您可以很自然地进行诸如“在某些情况下执行此操作”之类的功能