我有一个关于设计我的跨平台解决方案(Xamarin.Forms和ASP.NET核心)的体系结构的一般问题。
我有多个调用API端点(类似于博客聚合应用程序)的要求,我想创建一个使用无功扩展或改装将由双方Xamarin.Forms和ASP.NET网站的核心消费共享REST API包装库。按无功扩展(Rx.NET)文件 - “(可观察)这种方法的优点是,当你有一大堆的任务不依赖于对方,你可以在同一时间开始他们所有,而不是等待对于每一个启动下一个”前完成。但在我的情况,我想启动多个API调用终端在后台,但要等到这意味着任务依赖这里全部完成。
是否有意义在这里使用Rx.NET的可观测模式作为我的观察者用户将不会收到从可观察的任何通知,直到所有任务完成了吗?有什么优点和缺点在这里,如果我使用任务并行库(与Task.WhenAll()),而不是Rx.NET的可观测考虑到我需要消耗它包括移动(X.F)和网络(ASP.NET核心)平台上。
RX是真棒为同时调用多个API终点。
你可以选择来处理每个结果,因为它到达或有查询捆绑的结果作为一个数组,并在年底返回他们。
让我们先从API调用,像这样的数组:
var api_calls = new Func<string>[]
{
() => "Hello",
() => "World",
};
这是返回字符串函数的琐碎阵列。
现在最简单的Rx查询如下所示:
IObservable<string> query1 =
from f in api_calls.ToObservable()
from r in Observable.Start(() => f())
select r;
当您订阅这个查询,你得到一个值在其中调用返回的顺序(而不是在它们被要求的顺序)的时间。
你可以这样写这样的查询,而不是:
IObservable<string> query1 =
api_calls
.ToObservable()
.SelectMany(f =>
Observable
.Start(() => f()));
写此查询方式允许我们做一些事情。
如果我想返回所有的结果在最后,我只是这样做:
IObservable<string[]> query2 =
api_calls.ToObservable()
.SelectMany(f => Observable.Start(() => f()))
.ToArray();
现在,我得到一个可观察仍然同时查询,但只返回一个string[]
作为其唯一的价值。
现在的问题是,它可能是坏了。要恢复秩序(如果您希望有结果的匹配,你可以做到这一点的Func<string>[]
源的原始顺序:
IObservable<string[]> query =
api_calls
.ToObservable()
.SelectMany((f, i) =>
Observable
.Start(() => (i, f())))
.ToArray()
.Select(xs =>
xs
.OrderBy(x => x.Item1)
.Select(x => x.Item2)
.ToArray());
运行查询我得到{ "Hello", "World" }
的数组,顺序,每一次我订阅。