簡體   English   中英

如何創建可以從多個數據源中提取數據的IQueryable Web API?

[英]How to create an IQueryable Web API that can pull data from several data sources?

我正在試圖弄清楚如何編寫一個可以從多個源(在本例中為Azure Table,Azure Blob和ElasticSearch)中提取和組合數據的IQueryable數據源。 我真的很難弄清楚從哪里開始這個。

我們的想法是,Web服務(在本例中為Asp.Net Web Api)可以呈現可查詢的OData接口,但是當它被查詢時,它會根據請求從多個源中提取數據。 因此,大型查詢可能會觸及索引服務(ElasticSearch),該服務不一定具有完整對象可用,但是獲取單個對象的調用將直接轉到Azure表。 但從服務用戶的角度來看,它始終只是訪問相同的數據源。

雖然我想只使用索引作為我們的搜索服務而將表作為我們的備份,但我有一個設計要求,它必須從多個來源提取數據,這使整個事情變得非常復雜。

我想知道是否有人對此有任何指導或可以指出我正確的技術。 我看到的一些重大問題是:

  • 后端對象不一定與被查詢的前端對象相同。 多個后端對象可以組合成單個前端對象,或者它可以具有計算值。 因此必須翻譯或映射LINQ查詢
  • 根據查詢參數更改數據源

以下是我正在使用的技術的簡要概述:

  • 作為Azure雲服務運行的ASP.Net Web API 2 Web服務
  • 在SUSE VM上運行的ElasticSearch(在Azure上)
  • Azure表
  • Azure Blob

首先,您需要將數據訪問與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或{在這里命名你最喜歡的其他持久存儲}”經常最終變成垃圾桶。

這篇文章已經有一段時間了。 第二段/最后一段很接近,但仍然受到限制......即使在幾年前,這個架構也很常見。

無論是WPF還是ASP.NET或Java,還是編寫核心接口,關鍵路徑都是基於信息查詢的結果集。 由於項目的其他細節,我已經參與了多年,但是高層次,但分享的比我要多。

開發您的核心界面。 我們完成了一個完全取代Windows / Linux的shell。

開發一個解決方案架構,其中Providers是源組件。 提供者是發布組件。

現在 - 無論您的查詢“來源”如何 - 它只是另一個提供商。 無論Provider :: SourceAPI / ProviderSourceAPI :: Interface如何,與該Provider的接口都是抽象且一致的

當用戶想要查詢任何東西時...幾乎任何東西......犯罪背景檢查....只需點擊谷歌...查詢美國/美國任何地方的SW中的這些特定公共圖書館 - 用於結賬或簽到活動 - 這是非常相關。 退一步 - 考慮目標。 沒有任何解決方案太小,而且保證 - 對於此來說太大 - 抽象出解決方案的目標 - 並對其進行編碼。

所有查詢 - 無論是什么被搜索 - 都只是查詢。

所有響應 - 無論響應/結果集 - 都是結果 - ResultantProviderModel / ResultantProviderController(不,我沒有具體引用MVC)。

我不能在這里為你編寫一個文字示例..但我希望我挑戰你認為這個方法和解決方案比我在這里讀到的更加抽象和開放。 物理實現應該更加簡化,並且非常抽象地形成特定的技術堆棧。 搜索到的來源? 必須是抽象的 - 並使用提供者架構來實現。 所以 - 如果我有一個工具我的桌面或基本上辦公室工作人員使用 - 他們查詢的東西...... John Doe寫的物理學是什么?

在利用SharePoint和FAST Search的公司中? 這很容易,開箱即用......

對於自定義用戶界面組件 - 好吧 - 他們有后端管道要解決。 所以 - 從架構方法中抽象每個部分/層。 偽代碼 - 但是你選擇這樣做。 最重要的是,您不會被鎖定在鎖定特定開發范例,語言,IDE或其他任何內容的思維模式中。 如果你可以設計解決方案摘要並遍歷它是偽代碼 - 並為每個抽象層執行此操作...然后開始編碼它。 來源是相對的...出版方面 - 是相對的 - 一致的。

我不知道你是否會抓住這個 - 但也許會有人 - 而且它會證明是有幫助的。

HTH的...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM