首页 > 解决方案 > 在 ASP.NET Core API 中返回计算数据的最佳实践

问题描述


这是我在 stackoverflow.com 上的第一个问题。我是一名有抱负、自学成才的 Asp.NET 开发人员。我非常喜欢回答其他人的问题(我花了很多时间回答 Udemy 初学者的问题),并且有一天我希望能够以同样的方式为 Stack Overflow 做出贡献。

关于该项目的简要概述:
我正在使用 Asp.NET Core 制作一个 API,允许用户在工作现场打卡和打卡。由于多对多关系,用户和作业站点都可以有多个时间戳。所有基本的 crud 功能都在工作,我可以成功检查谁在工作现场打卡和/或用户在哪里打卡。我的最终目标是完成 API,然后创建一个 React 应用程序来使用它。

问题:
我现在将尝试创建返回更多“复杂”信息的路线。我希望用户路由能够根据该特定用户的数据库中的时间戳返回一般统计信息。到达这条路线时,我想返回一个带有计算信息的 DTO,如下所示:

上面的逻辑我实际上仍然需要弄清楚,因为这将是我需要学习的一堆 DateTime 排序,但问题是,执行上述操作并在 JSON 对象中返回这些计算的最佳方法是什么? 这是我正在考虑的 -

A) 创建一个helper类,里面会存储所有计算上述数据的方法,在用户控制器中一一调用这些方法,当场构建一个DTO并返回。

B)创建一个带有 GET 属性的 DTO,它将在里面进行所有计算(这可能吗?我需要一个示例),使用 Imapper 将实体映射到 DTO,返回 DTO。

C)在客户端执行此逻辑,也许这不是 API 的典型行为?(我是菜鸟)。

D)不是上述任何一种的解决方案

上述情况的最佳编码技术是什么?非常感谢您的时间。

罗宾逊

标签: asp.net-coreasp.net-core-webapi

解决方案


我的 3 条建议基于您的问题。但我会提到,基于意见的问题通常不是 Stackoverflow 推荐的。

  1. 使用专用的视图模型/DTO,您将在控制器内部填充您执行的各种函数调用的结果以获取计算的信息。这将使该模型的责任仅限于您的 API 返回的结果,并且不会被与您的客户端无关的信息夸大。

  2. 如果您正在做复杂的工作,或者只需要时间的工作,请将其置于 POST 操作之后,而不是 GET 操作。这将有助于避免浏览器在不需要信息的情况下尝试抢先检索/获取信息,或者当该路由/操作会对您的站点/应用程序/服务器的性能产生影响时

  3. 最后,看看缓存这项工作的结果。在控制器中,如果它是在 X 分钟前生成的,则返回先前的结果,或者使用 ResponseCaching 并让 Web 服务器缓存整个响应。

编辑:至于缓存,您可以添加响应缓存,您可以通过添加services.AddResponseCaching();到您的Startup.ConfigureServices方法来做到这一点,然后像这样装饰您的操作

[ResponseCache(Duration = 60 * 60 * 24 /* 1 Day */)] //Cached for a day
public async Task<IActionResult> DoStuff()

或者如果那里有一个查询字符串参数,例如......

[ResponseCache(Duration = 60 * 60 * 24 /* 1 Day */, VaryByQueryKeys = new[] { "someIdentitifer" })] //Cached for a day
public async Task<IActionResult> DoStuff(int someIdentitifer)

如果您想在您的应用程序中缓存而不是 HTTP 缓存,您可以考虑使用手动执行此操作,或者使用像LazyCacheMemoryCache一样的第三方包(不附属于他们)


推荐阅读