asp.net-core - 在 ASP.NET Core API 中返回计算数据的最佳实践
问题描述
这是我在 stackoverflow.com 上的第一个问题。我是一名有抱负、自学成才的 Asp.NET 开发人员。我非常喜欢回答其他人的问题(我花了很多时间回答 Udemy 初学者的问题),并且有一天我希望能够以同样的方式为 Stack Overflow 做出贡献。
关于该项目的简要概述:
我正在使用 Asp.NET Core 制作一个 API,允许用户在工作现场打卡和打卡。由于多对多关系,用户和作业站点都可以有多个时间戳。所有基本的 crud 功能都在工作,我可以成功检查谁在工作现场打卡和/或用户在哪里打卡。我的最终目标是完成 API,然后创建一个 React 应用程序来使用它。
问题:
我现在将尝试创建返回更多“复杂”信息的路线。我希望用户路由能够根据该特定用户的数据库中的时间戳返回一般统计信息。到达这条路线时,我想返回一个带有计算信息的 DTO,如下所示:
- 过去 7 天/2 周/月的总工作时间
- 过去 7 天/2 周/月的工作地点
- 允许接收 2 个日期以过滤过去 x 天/周/月的时间戳的路由器
上面的逻辑我实际上仍然需要弄清楚,因为这将是我需要学习的一堆 DateTime 排序,但问题是,执行上述操作并在 JSON 对象中返回这些计算的最佳方法是什么? 这是我正在考虑的 -
A) 创建一个helper类,里面会存储所有计算上述数据的方法,在用户控制器中一一调用这些方法,当场构建一个DTO并返回。
B)创建一个带有 GET 属性的 DTO,它将在里面进行所有计算(这可能吗?我需要一个示例),使用 Imapper 将实体映射到 DTO,返回 DTO。
C)在客户端执行此逻辑,也许这不是 API 的典型行为?(我是菜鸟)。
D)不是上述任何一种的解决方案
上述情况的最佳编码技术是什么?非常感谢您的时间。
罗宾逊
解决方案
我的 3 条建议基于您的问题。但我会提到,基于意见的问题通常不是 Stackoverflow 推荐的。
使用专用的视图模型/DTO,您将在控制器内部填充您执行的各种函数调用的结果以获取计算的信息。这将使该模型的责任仅限于您的 API 返回的结果,并且不会被与您的客户端无关的信息夸大。
如果您正在做复杂的工作,或者只需要时间的工作,请将其置于 POST 操作之后,而不是 GET 操作。这将有助于避免浏览器在不需要信息的情况下尝试抢先检索/获取信息,或者当该路由/操作会对您的站点/应用程序/服务器的性能产生影响时
最后,看看缓存这项工作的结果。在控制器中,如果它是在 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
一样的第三方包(不附属于他们)
推荐阅读
- python - 根据被积函数的对数计算积分的对数
- python - 当我下载文件时,该位置窗口不会消失,也没有错误。请帮帮我,这是我的确切代码。先感谢您
- terraform - 守门员为随机提供者映射解决了什么问题?
- java - 在接口中引用布尔值
- javascript - 我想折叠表格的标题,我做不到
- java - 在带有 Java 扩展的 SymmetricDS 中使用后备同步 URL
- jquery - JQuery Sortable - 不能将元素拖出排序一旦放入
- html - 在 shell 中抓取网页的算术
- c++ - 使我的堆栈可以从其他线程 c++ 访问
- reactjs - 无法在反应钩子主页中看到加载文本