如何创建一个可查询的Web API,可以从多个数据源中提取数据

本文关键字:数据源 数据 提取 API 查询 创建 何创建 一个 Web | 更新日期: 2023-09-27 18:03:11

我正试图找出如何编写一个可查询的数据源,可以从多个来源(在这种情况下,Azure表,Azure Blobs和ElasticSearch)中提取和组合数据。我真的很难弄清楚从哪里开始。

这个想法是一个web服务(在这个例子中是一个Asp。Net Web Api)可以提供一个可查询的OData接口,但是当它被查询时,它会根据所请求的内容从多个数据源提取数据。因此,大型查询可能会碰到索引服务(ElasticSearch),它不一定有完整的对象可用,但是获取单个对象的调用将直接到Azure表。但从服务用户的角度来看,它总是访问相同的数据源。

虽然我只想使用索引作为我们的搜索服务,表作为我们的备份,但我有一个设计要求,它必须从多个来源提取数据,这使整个事情变得非常复杂。

我想知道是否有人对此有任何指导,或者可以为我指出正确的技术。我看到的一些大问题是:

    后端对象不一定与被查询的前端对象相同。多个后端对象可以合并为单个前端对象,或者它可能具有计算值。所以LINQ查询必须被翻译或映射
  • 基于查询参数更改数据源

下面是我正在使用的技术的快速概述:

  • ASP。Net Web API 2 Web服务作为Azure云服务运行
  • ElasticSearch在SUSE vm上运行(Azure上)
  • <
  • Azure表/gh>
  • Azure blob

如何创建一个可查询的Web API,可以从多个数据源中提取数据

首先,您需要将数据访问与Web API项目分开。Web API项目仅仅是一个接口,所以把它从等式中去掉。无论它是web API还是ASP,问题的解决方案都应该是相同的。. NET网页,MVC解决方案,WPF桌面应用等

然后您可以专注于数据问题。您需要的是某种形式的"路由器",以根据做出决策的参数确定数据源。在这种情况下,你谈论的是1个物品= azure和多于1个物品-当多于1个物品时map reduce(我会设置规则作为策略或类似的策略,所以如果你发现1与2+不是改变路由的好条件,你可以交换)。

然后为每种方法解决数据访问问题。

整个系统

  1. 用户请求数据(用户可以是真人或通过web api的另一个系统)
  2. 查询被部分解析以确定路由路径
  3. 路由器将数据请求发送到处理路由数据访问的适当类
  4. 数据返回
  5. 数据通过使用的任何用户接口路由回用户(在本例中为Web API -参见第1段的其他选项)

一个警告。不要尝试混合所有类型的持久性,因为通用的"我可以提取数据或blob或{在这里命名您喜欢的其他持久性存储}"通常最终会变成一个垃圾桶。

这篇文章已经发布了一段时间了。第二/最后一段很接近,但仍然有限制……即使在几年前,这种架构也很常见。

是WPF还是ASP。. NET或Java,或任何编写核心接口的语言——关键路径是基于信息查询的结果集。高级别的,但由于我参与了一个项目好几年的其他细节,我分享了太多我应该分享的东西。

开发核心接口。我们做了一个完整的shell,完全取代了Windows/Linux。

开发一个解决方案架构,其中提供者是源组件。提供者是发布组件。

现在-不管你的查询'来源' -它只是另一个提供者。与该提供程序的接口是抽象的和一致的——不管Provider::SourceAPI/ProviderSourceAPI::Interface

当用户想查询任何东西时…字面上的东西…犯罪背景调查....只要点击谷歌…查询这些特定的公共图书馆在SW某处美国/任何地方美国-关于退房或签到的活动-这真的是相关的。退一步考虑目标。没有一个解决方案是太小的,并且保证-对于这个太大-抽象解决方案的目标-并对它们进行编码。

所有的查询——不管被搜索的是什么——都是简单的查询。

所有的响应-无论响应/结果集-是结果- ResultantProviderModel/ResultantProviderController(不,我没有特别引用MVC)。

我不能在这里给你写一个字面上的例子。但我希望我能挑战你,让你认为这种方法和解决方案比我在这里读到的更抽象、更开放。物理实现应该更加简化,并且非常抽象,形成一个特定的技术堆栈。搜索的来源?必须是抽象的——并且使用提供者体系结构来实现。所以,如果我有一个工具,我的桌面或基本上办公室工作人员使用-他们查询的东西…John Doe在物理方面写了什么?

在一个公司利用SharePoint和快速搜索?这很简单,开箱即用的东西…

对于自定义用户界面组件——嗯——他们有后端管道要解决。因此,从架构方法中抽象出每个部分/层。伪代码将其输出-无论您选择如何做。最重要的是,您不会被锁定在特定的开发范例、语言、IDE或其他东西的思维模式中。如果你能设计一个抽象的解决方案,并遍历它的伪代码——对每个抽象层都这样做……然后开始编码。来源是相对的……出版方面是相对一致的。

我不知道你是否会理解这一点——但也许有人会理解——这将证明是有用的。

HTH…