比nestjs更优雅的ts控制反转策略-依赖查找

2024-04-06 09:20

本文主要是介绍比nestjs更优雅的ts控制反转策略-依赖查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Cabloy5.0内测预告

Cabloy5.0采用TS对整个全栈框架进行了脱胎换骨般的大重构,并且提供了更加优雅的ts控制反转策略,让我们的业务开发更加快捷顺畅

1. 新旧技术栈对比:

后端前端
旧版js、egg2.0、mysqljs、vue2、framework7
新版ts、egg3.0、多数据库兼容(支持mysql、postgresql)ts、vue3、quasar

2. 框架开发两大趋势

  1. TS化:这是显而易见的趋势,不必赘言

  2. ESM化:从目前趋势看,前端框架已经全链路ESM化了,但是,大多数后端框架仍然是Commonjs。即便是egg3.0也仍然是Commonjs。由于egg的定位仍然是元框架,CabloyJS5.0在egg基础上仍然开发出了全量ESM化的业务模块化系统(在Commonjs之上进行ESM化的具体机制是什么,另有文章阐述)

二、比nestjs更优雅的ts控制反转策略

基于TS的后端框架一般都会提供依赖容器,实现控制反转。控制反转有两种策略:依赖注入依赖查找。CabloyJS5.0同时支持依赖注入依赖查找,并且通过模块范围的辅助,让依赖查找的代码更加简洁高效,下面挑几个特性举例说明:

  1. Service服务
  2. Config配置
  3. 多语言
  4. 错误异常

三、Service服务

1. 创建一个Service

在CabloyJS中,local bean相当于nestjs中service的概念,下面创建一个local bean

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalHome extends BeanBase<ScopeModule> {async echo({ user: _user }) {return `Hello World!`;}
}
  1. 通过@Local声明LocalHome是一个local bean

  2. LocalHome继承自基类BeanBase

2. Service的依赖注入

接下来,在Controller中采用依赖注入的方式来使用LocalHome

import { BeanBase, Controller, Use } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';
import { LocalHome } from '../local/home.js';@Controller()
export class ControllerHome extends BeanBase<ScopeModule> {@Use()home: LocalHome;async echo() {const res = await this.home.echo({user: this.ctx.state.user.op,});this.ctx.success(res);}
}
  1. 使用@Use注入LocalHome

3. Service的依赖查找

接下来,在Controller中采用依赖查找的方式来使用LocalHome

import { BeanBase, Controller } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Controller()
export class ControllerHome extends BeanBase<ScopeModule> {async echo() {const res = await this.scope.local.home.echo({user: this.ctx.state.user.op,});this.ctx.success(res);}
}
  1. 不需要导入LocalHome,直接在代码中使用this.scope.local来访问容器中的local bean实例

看一下动画演示,提供了完整的类型智能提示:

在这里插入图片描述

四、Config配置

1. 定义Config

可以为业务模块单独定义一些Config配置,如下:

import { CabloyApplication } from '@cabloy/core';export const config = (_app: CabloyApplication) => {return {
+   prompt: 'hello world',};
};

2. 使用Config

可以在LocalHome中直接使用刚才定义的config

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalHome extends BeanBase<ScopeModule> {async echo({ user: _user }) {
+   return this.scope.config.prompt;
-   return `Hello World!`;}
}
  1. 不需要导入任何类型,直接在代码中使用this.scope.config来访问当前业务模块中的config配置

看一下动画演示,提供了完整的类型智能提示:

在这里插入图片描述

五、多语言

1. 定义语言资源

可以为业务模块定义语言资源,比如,这里分别定义英文和中文两种语言资源

英文

export default {HelloWorld: 'Hello World',
};

中文

export default {HelloWorld: '您好世界',
};

2. 使用语言资源

可以在LocalHome中直接使用刚才定义的语言资源

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalHome extends BeanBase<ScopeModule> {async action({ user: _user }) {
+   // 自动判断当前语言
+   const message = this.scope.locale.HelloWorld();
+   // 强制使用英文资源
+   const message1 = this.scope.locale.HelloWorld.locale('en-us');
+   // 强制使用中文资源
+   const message2 = this.scope.locale.HelloWorld.locale('zh-cn');
+   return `${message}:${message1}:${message2}`;
-   return this.scope.config.prompt;}
}
  1. 不需要导入任何类型,直接在代码中使用this.scope.locale来访问当前业务模块中的语言资源

看一下动画演示,提供了完整的类型智能提示:

在这里插入图片描述

六、错误异常

1. 定义错误码

可以为业务模块定义错误码

export enum Errors {
+ Error001 = 1001,
}
  1. 这里定义了一个错误枚举类型Error001,对应的错误码是1001

2. 定义错误码对应的语言资源

可以为错误码定义语言资源,比如,这里分别定义英文和中文两种语言资源

英文

export default {
+ Error001: 'This is a test',HelloWorld: 'Hello World',
};

中文

export default {
+ Error001: '这是一个错误',HelloWorld: 'Hello World',
};

3. 抛出错误异常

可以在LocalHome中直接使用刚才定义的错误枚举值,并抛出异常

import { ScopeModule } from '../resource/this.js';@Local()
export class LocalHome extends BeanBase<ScopeModule> {async action({ user: _user }) {
+   // 直接抛出异常
+   this.scope.error.Error001.throw();
-   return this.scope.config.prompt;}
}
  1. 不需要导入任何类型,直接在代码中使用this.scope.error来访问当前业务模块中的错误枚举值

看一下动画演示,提供了完整的类型智能提示:

在这里插入图片描述

六、后记

Cabloy4.0中就已经提供了大量业务能力,比如:工作流引擎、表单引擎、权限引擎、字段权限、多级缓存、模块化体系、分布式架构、多租户引擎,等等。随着Cabloy5.0 Typescript的赋能,这些业务能力也随之有了全新的表现

欲了解更多,请关注每晚8点B站直播:濮水代码

这篇关于比nestjs更优雅的ts控制反转策略-依赖查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2