比 Nest.js 更优雅的 TS 控制反转策略 - 依赖查找
一、Cabloy5.0内测预告
Cabloy5.0采用TS对整个全栈框架进行了脱胎换骨般的大重构,并且提供了更加优雅的ts控制反转策略,让我们的业务开发更加快捷顺畅
1. 新旧技术栈对比:
后端 | 前端 | |
---|---|---|
旧版 | js、egg2.0、mysql | js、vue2、framework7 |
新版 | ts、egg3.0、多数据库兼容(支持mysql、postgresql) | ts、vue3、quasar |
2. 框架开发两大趋势
-
TS化:这是显而易见的趋势,不必赘言
-
ESM化:从目前趋势看,前端框架已经全链路ESM化了,但是,大多数后端框架仍然是Commonjs。即便是egg3.0也仍然是Commonjs。由于egg的定位仍然是元框架,CabloyJS5.0在egg基础上仍然开发出了全量ESM化的业务模块化系统(在Commonjs之上进行ESM化的具体机制是什么,另有文章阐述)
二、比nestjs更优雅的ts控制反转策略
基于TS的后端框架一般都会提供依赖容器,实现控制反转。控制反转有两种策略:依赖注入和依赖查找。CabloyJS5.0同时支持依赖注入和依赖查找,并且通过模块范围的辅助,让依赖查找的代码更加简洁高效,下面挑几个特性举例说明:
- Service服务
- Config配置
- 多语言
- 错误异常
三、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!`; } }
-
通过
@Local
声明LocalHome是一个local bean -
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); } }
- 使用
@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); } }
- 不需要导入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!`; } }
- 不需要导入任何类型,直接在代码中使用
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; } }
- 不需要导入任何类型,直接在代码中使用
this.scope.locale
来访问当前业务模块中的语言资源
看一下动画演示,提供了完整的类型智能提示:
六、错误异常
1. 定义错误码
可以为业务模块定义错误码
export enum Errors { + Error001 = 1001, }
- 这里定义了一个错误枚举类型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; } }
- 不需要导入任何类型,直接在代码中使用
this.scope.error
来访问当前业务模块中的错误枚举值
看一下动画演示,提供了完整的类型智能提示:
六、后记
Cabloy4.0中就已经提供了大量业务能力,比如:工作流引擎、表单引擎、权限引擎、字段权限、多级缓存、模块化体系、分布式架构、多租户引擎,等等。随着Cabloy5.0 Typescript的赋能,这些业务能力也随之有了全新的表现
欲了解更多,请关注每晚8点B站直播:濮水代码

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
VSCode v1.88 发布,多项体验增强
🐯 关于作者 大家好,我是前端之虎陈随易。 目前是: 农村程序员 (自 2020 年离职至今都在农村待着) 独立开发者 (有多个已经在盈利中的产品) 自由职业者 (睡到自然醒,困就马上睡) 个人创业者 (注册了自己的公司,为产品服务) 自驾爱好者 (经常自驾,边看风景边敲码) 小说写作者 (断更 10年,目前构思新作品中) 开源推进者 (自 2019 年持续开源至今) 欢迎跟我交朋友: 微信:chensuiyime 扣扣:24323626 公众号:陈随易 网站:陈随易的个人网站 https://chensuiyi.me 如果微信加不上,可以公众号留言你的微信号,我加你。 让我们一起积极向上,为自己而努力奋斗! 一点碎碎念 这个版本挺期待的,因为 v1.87版本 搭载的 Electron 是 v27 版本。 而在 2024年4月4日 发布了 v1.88 版本后,我查看了一下 关于 信息,显示的是 Electron v28 版本。 这个版本有什么特点呢? 由以上截图可以看到,Electron v28 版本正式支持了 ESM。 那么什么是 ESM 呢? 这是 JavaScript 的官方模...
- 下一篇
【店滴云】店滴云单模块,单服务可以以微服务的方式分割了
店滴云单模块,单服务可以以微服务的方式分割了 随着企业业务规模的扩大和技术的不断进步,传统的单体应用架构已经难以满足企业对灵活性和可扩展性的需求。在这种背景下,微服务架构以其独特的优势逐渐成为了企业信息化建设的首选。近日,店滴云宣布其单模块已成功实现微服务化分割,为企业带来了更加高效、灵活的服务体验。 微服务架构是一种将单个应用拆分为一组小型服务的方法,每个服务都运行在自己的进程中,并通过轻量级通信机制进行交互。这种架构风格使得企业能够更加灵活地部署、扩展和管理应用,同时也提高了系统的可维护性和可靠性。 店滴云单模块的微服务化分割,意味着原本庞大而复杂的单体应用被拆解为多个独立的小型服务。每个服务都专注于完成特定的业务功能,并拥有自己的技术栈和数据模型。这样的设计使得每个服务都可以独立地进行开发、测试和部署,从而大大提高了开发效率和响应速度。 同时,微服务化分割还带来了更好的资源利用率和可扩展性。由于每个服务都是独立的,企业可以根据实际需求对不同的服务进行独立的扩展或缩减,避免了资源的浪费和成本的增加。此外,每个服务都可以使用最适合的技术栈和编程语言进行开发,进一步提高了系统的灵活性和...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7