对 DAL 进行多次小调用还是 return 大 JSON 响应更好?

Is it better practice to make multiple small calls to the DAL or return a large JSON response?

我正在构建两个服务应用程序,一个使用 Entity Framework(我的数据访问层)连接数据库,另一个处理我的所有业务逻辑。这两个应用程序都是 Web API 应用程序。

我想 return 企业 api 最终对我的外部客户做出 return 的回应,但我不确定幕后的最佳方法是什么。数据 returned 将是描述公司成员的嵌套 JSON 响应。我的业务层是否应该对数据api进行多次异步调用以收集数据?或者我的业务层应该进行一次调用,让数据访问层在一种方法中进行多次调用,然后 return 嵌套 json 响应返回业务层?

我对这种类型的架构还很陌生,所以我想确保我遵循了最佳实践。

如果数据太大,并且您认为性能是一个问题,那么也许最好拆分您的网络 api 这样您就可以让最终用户选择他想要获取的数据,因为他会肯定有同样的问题。

这可以通过在不同的功能中拆分信息类型,或在您的 API 上鼓励过滤器和分页功能(甚至设置限制)来实现。

您的 API 是否必须进行多次调用,还取决于您为收集数据所做的查询...如果您进行多次调用,您将始终必须按客户对查询进行分组,并以某种方式在您的模型上重复 EF 的某些映射,当您 return 数据时,您必须对结果进行相同的工作。这只能由巨大的数据负载驱动(当您锁定一个或多个表时 SQL 查询的性能下降)

视情况而定。

无论如何,你需要确定你的瓶颈在哪里。负载测试是你的朋友。

不要仅仅因为某种架构很流行或因为它在图表中看起来很整洁就选择某种架构。选择最简单有效的方法,然后让需求和测试结果告诉您下一步该怎么做。

这样您就可以根据业务角度的实际需求做出最明智的决定。这是一个显而易见但通常被忽视的最佳实践。

如果您和您的客户正在使用 OData 并且您的业务逻辑层只处理基本的事情,例如验证,那么大多数时候您将对每个请求的 API 进行一次 HTTP 调用action/function 由客户。 OData 查询将包含有关 properties/entities GET、POST 或 PUT 的信息。因此,您永远不会通过线路发送不必要的信息,这样请求就可以按原样传递到您的数据层。

当(任何或所有)发生变化时:

  • 您在更简单、类似 CRUD 的应用程序中拥有大型模型。
  • 您的业务逻辑层中有复杂的(长-运行)逻辑
  • 您的业务逻辑/数据层需要来自多个来源的数据,例如丰富产品信息的外部服务。

请记住,异步处理的性能优势只有在实际同时执行请求时才会出现。如果将某个操作或功能拆分为链条下游的多个请求,与根本不拆分时相比,您的 API 需要 return 完全相同的结果。

为了能够对此发表一些有用的意见,我需要更多关于 API 调用您的 BLL 和 DAL 的相同效力和相互依赖程度的信息。

话虽如此,性能可能甚至不是您在这里最关心的问题。如果您的主要 objective 是拥有一个高度可扩展、可插入的架构,其中不同的组件可以相互独立开发,您通常有两种风格:

  1. 一种类似于 OWIN 的管道方法。您可以轻松地将额外的中间件插入管道(甚至来自外部程序集),并且是否在通信链的任何部分拆分 JSON 取决于这样做是否有性能优势。

  2. 一个成熟的 SOA,其中每个组件本身就是一个网络服务,也称为 "microservices"。如果您的数据来自不同的(内部 and/or 外部)来源,您可能会采用这种方法。当这些来源之一更新其规范时,这为您提供了更大的灵活性 - 您只需要更新并重新部署特定的 API.

但是,我怎么强调都不为过:从最简单的事情开始,然后从那里尝试找出您实际 需要