从 api 中提取批量数据并存储在数据库中的最佳实践

Best practice for pulling bulk data from api and storing in database

我在 ASP.NET Core 中编写了一个小应用程序来创建和管理 collections 卡牌收集游戏。我目前有一个版本可以通过 API 调用成功下载批量卡数据,解析 JSON 响应,并将其加载到本地 SQL 服务器数据库中。然后我使用本地数据将卡片添加到 collections、查找价格等。作为一项学术练习,我故意将其设计过度复杂化,就好像它是一个大型企业应用程序一样,因为我确实有除了学习更多关于编程的知识外,没有理由构建它,所以我想知道类似这样的最佳实践?

目前,我将应用程序分为四个项目:一个 API 客户端,用于从外部 API 提取卡片数据,一个使用 EF Core 的数据 access/domain 层和 SQL 服务器,一个协调一切的服务层,以及一个 Blazor 服务器 UI。我遇到的主要问题是我的服务层同时依赖于 API 客户端和 DBContext,所以我想知道是否有一个很好的方法来巩固依赖关系,因为来自两个来源的数据映射到同一域 objects.

根据我的阅读,设置存储库似乎是一个不错的选择,并且在使用多个数据源时很常见。我有第二个版本,其中包含用于访问本地数据库的存储库,但我不确定如何将外部 API 调用引入该版本。我想我可以创建卡存储库接口的单独实现,一个用于访问我的本地 SQL 数据库,另一个用于访问外部 API 但我不确定应用程序如何知道我何时需要一个或者另一个,如果我使用依赖注入。

例如,我想定期检查来自外部的更新卡数据 API 并用新数据更新我的数据库,但大多数情况下我将从本地读取卡数据用于管理 collections 的数据库。关于如何处理这个问题的任何建议?如果需要,我可以提供代码示例。谢谢

尝试限制您从中提取的需要执行逻辑的源的数量。你能结合你的数据吗? 尝试简化您的逻辑。 检查此 link。它用于扫描 SQL 服务器中的更改。

Check for changes to an SQL Server table?

您的服务层不应依赖于 API 或 DBContext,相反(正如您已经研究过的那样)您将有一个存储库来访问您的服务层的数据。对数据库和其他外部 API 的调用也应该在您的存储库中进行,因为您的服务层不应该知道如何访问数据。

您的存储库应该按业务分隔 objects,不一定是表本身 - 但是我肯定会将每个外部第 3 方 API 分隔到其自己的存储库中。

对于我工作的一家物流公司,我实施了一个动态设计,我能够创建一个结构良好的存储库模式,该模式可以从我们公司内部的数据库(运输和会计系统)中提取数据,或者来自第 3 方 API(例如航班或货运数据)并将查询或响应数据存储到我们的 SQL 服务器或 Oracle 数据库中。这并不难实现。

对于调用第三方 API 的存储库,我学到的一件重要事情是确保为 API 请求调用设计一个通用的模式。这是通过创建一个单独的 APIClient 解决方案来完成的,您可以在其中创建 HttpClient、添加 Headers、查询参数与 POST/PUT/PATCH body 以及您需要的其他项目不同类型的请求。此外,您还必须考虑包括逻辑流程以获取后续 API 调用的身份验证令牌。

另一件我也利用的事情是第 3 方 API 提供的 webhooks,这样我就不必不断地轮询数据以查看发生了什么变化,而是他们当他们那边发生变化时,将数据发送给我。

有很多方法可以完成您喜欢的项目,希望我已经给了您一些有用的想法。