一、Cabloy5.0内测预告

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

1. 新旧技术栈对比:

后端 前端
旧版 js、egg2.0、mysql js、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控制反转策略-依赖查找的更多相关文章

  1. 轻松了解Spring中的控制反转和依赖注入(一)

    我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...

  2. 简单了解Spring的控制反转和依赖注入

    浅谈控制反转(Inversion of Control,IOC) 我们首先先来了解一下控制二字,也就是在控制"正"转的情况下,在任何一个有请求作用的系统当中,至少需要有两个类互相配 ...

  3. Spring中的控制反转和依赖注入

    Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...

  4. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  5. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

  6. Java 控制反转和依赖注入模式【翻译】【整理】

    Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...

  7. java控制反转与依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

  8. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  9. spring学习总结一----控制反转与依赖注入

    spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...

  10. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

随机推荐

  1. 【Azure 环境】Azure 流分析服务(Steam Analytics) 报出 OutputDataConversionError 错误引起延迟及超时

    问题描述 Azure 流分析服务(Steam Analytics) 报出 OutputDataConversionError 错误引起延迟及超时. 查看详细错误: 问题解答 在错误消息中,有非常明确的 ...

  2. 没想到,JDBC 驱动会偷偷修改 sql_mode 的会话值

    最近碰到一个 case,值得分享一下. 现象就是一个 update 操作,在 mysql 客户端中执行提示 warning,但在 java 程序中执行却又报错. 问题重现 mysql> crea ...

  3. 独家消息:阿里云悄然推出RPA云电脑,已与多家RPA厂商开放合作

    独家消息:阿里云悄然推出RPA云电脑,已与多家RPA厂商开放合作 RPA云电脑,让RPA开箱即用算力无限? 文/王吉伟 这几天,王吉伟频道通过业内人士获得独家消息,阿里云近期推出了一个名为「RPA云电 ...

  4. Linux cp命令直接覆盖不提示的方法

    今天在做项目的时候需要在linux上拷贝A项目中upload目录下所有的资源到B项目中的uoload目录下,所以我就打算使用[cp]命令拷贝过去,拷贝的时候我加了[-f]参数了,但还是一个个的询问我是 ...

  5. C++ Qt开发:QNetworkAccessManager网络接口组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNe ...

  6. linux下,使用nginx实现动静分离,访问图片报404

    一.需求描述 最近在开发一个微信小程序,由于微信小程序端代码包总大小限定在三四兆,所以有很多的图标资源就不能放在微信小程序中进行打包, 否则会超过微信的限制而无法打包.自己能够想到的最简单的办法就是将 ...

  7. SyntaxError: invalid property id(就是不支持ES6) (浏览器不支持对象...展开)

    SyntaxError: invalid property id(就是不支持ES6) (浏览器不支持对象...展开) 火狐55以后支持

  8. DatePicker 日期选择器 split-panels 数组的时候,清空这个费劲啊,最后走的后门

    这里的核心问题就是验证的时候value值不对,总是初始化的值,不论怎么设置,开始觉得是数组指针的问题,最后也不行,null也不行,组件的props都已经是null了,验证就是这么神奇,最后把this放 ...

  9. 超低功耗mcu芯片AMA3B 开发备忘之初串口打印

    一 前言   对于软件工程师来说,没什么比看到一个hello world的打印更让人感觉兴奋了.调试芯片,很多人都知道,hello world这个打印意味着什么.   二 软硬件准备   1 一个AM ...

  10. linux下查看端口对应的进程号

    在部署服务的时候,会指定对应的端口号,如果想kill 对应的端口,就要找到对应的进程,查看端口对应的进程号,有两种方法: 1.lsof命令,查看系统打开的文件(在linux中,所有的都是文件),需要管 ...