Web开发:ABP框架中的服务调用原则--避免服务之间的直接依赖

2024-08-30 08:28

本文主要是介绍Web开发:ABP框架中的服务调用原则--避免服务之间的直接依赖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

示意图

(Service之间可以相互调用,使用依赖倒置原则:例如某个服务可注入到另一个服务,用法:private readonly IyyyService _yyyService;) 

命名约定

  • WebAPI 控制器: 建议命名为 XXXXController 或 XXXXManagementController(也有的命名为XXXXManagementService,主要用于处理HTTP请求
  • 业务逻辑层服务(BLL): 命名为 XXXXService,主要用于增删改查和写基本逻辑,通常会被 Web API 控制器调用。
  • 数据访问层仓储(DAL): 使用 XXXXRepository 命名, ORM(对象关系映射)处理,很可能用到反射之类的技术。

接口定义

  • 通常,为了实现解耦和便于测试,建议为业务逻辑层服务 (XXXXService) 和数据访问层仓储 (XXXXRepository) 定义接口。这些接口可以放在 Application.Contracts 命名空间下。
  • 责任: 定义服务和仓储层的合同,以便于实现依赖注入和松耦合。

参数设计

  • 在设计业务逻辑层服务(BLL)的方法时,推荐使用列表类型作为输入参数和返回值,这样可以更好地支持批量操作,并提高代码的重用性。对于复杂的数据交互,可以考虑使用专门的 DTO(数据传输对象)。

调用关系

  • 一个 WebAPI 控制器不允许调用另一个 WebAPI 控制器。
  • 直接的控制器间调用可能会导致架构复杂度增加维护困难调试困难。更好的做法是通过服务层 (XXXXService) 进行协调,将所需的业务逻辑封装在服务层内部,然后由需要的控制器调用相应的服务方法来获取或处理数据。
  • 如果两个Webapi控制器相互注入,会导致循环依赖从而无法解析依赖,导致程序无法启动或启动后增加额外开销,影响系统稳定性

反例:

[HttpGet]
[Route("GetMenuAsync")]//MenuManageService.cs
public async Task GetMenuAsyncc(IputDto input)
{var com_list = (await _componentManageService.GetListAsync());
}[HttpGet]
[Route("GetListAsync")]//componentManageService.cs
public async Task<PagedResultDto<ComponentTypeDto>> GetListAsync(ComponentTypeDto input)
{//省略方法
}

        综上所述,在实际开发过程中,尽量避免控制器之间的直接调用,而是通过共享的服务层来协调不同的业务需求,这样可以确保系统架构更加清晰、易于维护。

这篇关于Web开发:ABP框架中的服务调用原则--避免服务之间的直接依赖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120300

相关文章

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加