【问题标题】:How to create an IQueryable Web API that can pull data from several data sources?如何创建可以从多个数据源中提取数据的 IQueryable Web API?
【发布时间】:2014-05-13 13:44:14
【问题描述】:

我试图弄清楚如何编写一个 IQueryable 数据源,该数据源可以从多个源(在本例中为 Azure Table、Azure Blob 和 ElasticSearch)提取和组合数据。不过,我真的很难弄清楚从哪里开始。

这个想法是,Web 服务(在本例中为 Asp.Net Web Api)可以提供可查询的 OData 接口,但当它被查询时,它会根据请求从多个来源提取数据。如此大的查询可能会命中索引服务 (ElasticSearch),它不一定具有可用的完整对象,但获取单个对象的调用将直接转到 Azure 表。但从服务用户的角度来看,它始终只是访问同一个数据源。

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

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

  • 后端对象不一定与被查询的前端对象相同。多个后端对象可能会组合成一个前端对象,或者它可能具有计算值。因此,必须翻译或映射 LINQ 查询
  • 根据查询参数更改数据源

以下是我正在使用的技术的简要概述:

  • 作为 Azure 云服务运行的 ASP.Net Web API 2 Web 服务
  • 在 SUSE VM 上运行的 ElasticSearch(在 Azure 上)
  • Azure 表
  • Azure Blob

【问题讨论】:

  • 你是怎么解决这个问题的?
  • 老实说,在研究之后,我们决定简化并只使用更多定向 api 调用(GetAllLicensedUsers 而不是 IQueryable GetAll)。
  • 但是 Gregory A Beamer 给出了正确的答案。我确实解决了这个问题。现在已经有一段时间了,但是有一个类可以部分解析查询,我们使用 AutoMapper 投影来规范化数据。我相信它可以双向使用。它可以根据不同来源的特定规则更改查询,并且在返回时将数据映射到统一的模型。对不起,我没有更好的答案。已经有一段时间了。
  • 谢谢。我一直在考虑抽象出一个每个存储库都可以解释的查询接口,但这似乎是一项繁重的工作。
  • 是的,一个不平凡的问题,不仅要解决,还要实施。除非有很好的理由,否则我会避免它。

标签: c# linq azure elasticsearch iqueryable


【解决方案1】:

首先,您需要将数据访问与 Web API 项目分开。 Web API 项目只是一个接口,因此将其从等式中删除。无论是web API还是ASP.NET网页、MVC方案、WPF桌面应用等,问题的解决方案都应该是一样的。

然后您可以专注于数据问题。您需要某种形式的“路由器”来根据做出决定的参数来确定数据源。在这种情况下,您正在谈论 1 项 = 天蓝色和超过 1 项 - 并且在超过 1 项时映射减少(我会将规则设置为策略或类似的,因此如果您发现 1 对 2+不是改变路由的好条件)。

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

整个系统。

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

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

【讨论】:

  • 感谢您解决问题。查看需要完成的各个部分非常有帮助。
【解决方案2】:

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

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

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

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

现在 - 无论您的查询“来源”如何 - 它只是另一个提供者。与该 Provider 的接口 - 是抽象且一致的 - 与 Provider::SourceAPI/ProviderSourceAPI::Interface 无关

当用户想要查询任何内容时...实际上任何内容...犯罪背景调查...只需点击 Google...查询美国/美国任何地方西南地区的这些特定公共图书馆 - 了解结账活动或签到 - 这真的很重要。退后一步 - 并考虑目标。没有解决方案太小,并且保证 - 太大 - 抽象解决方案的目标 - 并对其进行编码。

所有查询 - 无论搜索的是什么 - 都是简单的查询。

所有响应 - 无论响应/结果集如何 - 都是结果 - ResultantProviderModel / ResultantProviderController(不,我没有专门引用 MVC)。

我无法在这里为您编写一个文字示例.. 但我希望我挑战您考虑比我在这里读到的更抽象和开放的方法和解决方案。物理实现应该更加简化并且非常抽象,形成特定的技术堆栈。搜索的来源?必须是抽象的 - 并使用提供者架构来实现。所以 - 如果我有一个工具我的桌面或基本上是办公室工作人员使用 - 他们会查询一些东西...... John Doe 在物理学上写了什么???

在利用 SharePoint 和 FAST Search 的公司中?这很简单,开箱即用的东西......

对于自定义用户界面组件 - 嗯 - 他们需要解决后端管道问题。所以 - 从架构方法中抽象每个部分/层。伪编码它 - 但是你选择这样做。最重要的是,您不会被锁定在特定开发范式、语言、IDE 或其他任何东西中的思维定势。如果您可以设计解决方案摘要并通过伪代码完成它 - 并为每个抽象层执行此操作......然后开始对其进行编码。来源是相对的......出版方面 - 是相对的 - 一致的。

我不知道你是否会掌握这一点 - 但也许有人会 - 这会很有帮助。

HTH 的...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多