Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对DAL进行多个小的调用或返回一个大的JSON响应是更好的做法吗?_C#_Json_Entity Framework_Asp.net Web Api - Fatal编程技术网

C# 对DAL进行多个小的调用或返回一个大的JSON响应是更好的做法吗?

C# 对DAL进行多个小的调用或返回一个大的JSON响应是更好的做法吗?,c#,json,entity-framework,asp.net-web-api,C#,Json,Entity Framework,Asp.net Web Api,我正在构建两个服务应用程序,一个使用实体框架(我的数据访问层)连接数据库,另一个处理我的所有业务逻辑。这两个应用程序都是Web API应用程序 我希望最终将一个JSON响应从业务api返回给我的外部客户端,但我不确定幕后的最佳方法是什么。返回的数据将是描述公司成员的嵌套JSON响应。我的业务层是否应该对数据api进行多个异步调用以收集数据?或者我的业务层应该进行一次调用,让数据访问层在一个方法中进行多次调用,并将一个嵌套的json响应返回给业务层 我对这种类型的体系结构相当陌生,所以我想确保我遵

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

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


我对这种类型的体系结构相当陌生,所以我想确保我遵循了最佳实践。

如果数据太大,并且您认为性能是一个问题,那么也许最好拆分web api,让最终用户选择他想要的数据,因为他肯定会遇到同样的问题

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

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

这取决于

在任何情况下,您都需要确定瓶颈在哪里。负载测试是您的朋友

不要仅仅因为某一类型的架构很受欢迎或在图表中看起来很整洁就使用它。做最简单的事情,然后让需求和测试结果告诉你下一步要做什么

通过这种方式,您将根据实际需要从业务角度做出最明智的决策。这是一个显而易见但通常被忽视的最佳实践

如果您和您的客户机正在使用OData,并且您的业务逻辑层只负责验证之类的基本工作,那么大多数情况下,对于客户机请求的每个操作/函数,您都会对API进行一次HTTP调用。OData查询将包含有关获取、发布或放置哪些属性/实体的信息。因此,您永远不会通过线路发送超过必要的信息,因此请求可以按原样传递到数据层

当(任何或全部)发生以下情况时,此项会发生变化:

  • 在一个更简单、更像CRUD的应用程序中,您拥有大型模型
  • 您的业务逻辑层中有复杂的(长期运行的)逻辑
  • 您的业务逻辑/数据层需要来自多个来源的数据,例如丰富产品信息的外部服务
请记住,异步处理的性能优势只有在请求实际同时执行时才会出现。如果将某个操作或函数拆分为链下游的多个请求,则与完全不拆分时相比,您的API需要返回完全相同的结果

为了能够说一些有用的话,我需要更多关于idem效力的程度以及对BLL和DAL的API调用的相互依赖性的信息

尽管如此,在这里,性能甚至可能不是您首先关心的问题。如果您的主要目标是拥有一个高度可扩展、可插拔的体系结构,其中不同的组件可以彼此独立开发,那么您通常有两种风格:

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

  • 一个成熟的SOA,其中每个组件本身就是一个Web服务,也称为“微服务”。如果您的数据来自不同的(内部和/或外部)来源,您可能会采用这种方法。当其中一个源更新其规范时,这为您提供了更大的灵活性—您只需要更新和重新部署特定的API


  • 但是,我再强调也不过分:从最简单的事情开始,然后试着找出你真正需要什么。这取决于太多我们看不见的因素,所以说不出任何有用的东西。我的首选是让服务本身提供聚合(以及与底层数据源分离的独立视图)。然而,没有一种真正的方法。。您可能有兴趣阅读“聚合根”(它可以提供对一个共同划分的见解),其中有许多文章和观点。在这两种情况下,我认为让服务层增加价值并且不以脆弱的方式公开数据实现是很重要的(这就是为什么我不在服务边界重用EF实体)。