比nestjs更优雅的ioc:跨模块访问资源

使用ts的最佳境界:化类型于无形

在项目中使用ts可以带来类型智能提示与校验的诸多好处。同时,为了减少类型标注,达到化类型于无形的效果,CabloyJS引入了ioc和依赖查找的机制。在上一篇文章中,我们创建了一个业务模块test-home,并且采用依赖查找的机制演示了如何优雅的定义和使用资源,包括:Service服务、Config配置、国际化语言资源、Error错误异常

在实际的项目当中,经常会遇到跨模块访问资源的场景,那么,CabloyJS的依赖查找机制是否仍然可以优雅的实现跨模块访问呢?让我们一睹为快

模块化体系与任务说明

CabloyJS全栈框架的前后端均采用模块化体系。一个CabloyJS项目由多个业务模块组成,每个业务模块都可以包含与自身业务相关的资源,比如:Service服务、Config配置、国际化语言资源、Error错误异常、中间件、定时任务、消息队列、系统启动项,等等

在这里,我们创建一个新的业务模块test-work,在test-work中访问test-home提供的资源

1. 新建业务模块

cabloy api:create:module test-work

2. 新建API

通过一个命令同时创建一组文件:Route、Controller、Service

cabloy api:create:controller work

3. 跨模块访问Service服务

接下来,我们在刚才新建的Service当中,访问模块test-home的Service服务

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalWork extends BeanBase<ScopeModule> {async action({ user }) {
+   const scopeHome = this.getScope('test-home');
+   return scopeHome.local.home.action({ user });// return user;}
}
  1. 通过getScope方法获取模块test-home的scope对象
  2. 通过scope对象直接访问Service服务: home

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

在这里插入图片描述

4. 跨模块访问Config配置

访问模块test-home的Config配置

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalWork extends BeanBase<ScopeModule> {async action({ user }) {const scopeHome = this.getScope('test-home');
+   const prompt = scopeHome.config.prompt;return scopeHome.local.home.action({ user });// return user;}
}
  1. 直接通过scopeHome取得config中的prompt属性值

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

在这里插入图片描述

5. 跨模块访问国际化语言资源

访问模块test-home的国际化语言资源

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalWork extends BeanBase<ScopeModule> {async action({ user }) {const scopeHome = this.getScope('test-home');
+   const message = scopeHome.locale.HelloWorld();
+   const message1 = scopeHome.locale.HelloWorld.locale('en-us');
+   const message2 = scopeHome.locale.HelloWorld.locale('zh-cn');return scopeHome.local.home.action({ user });// return user;}
}

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

在这里插入图片描述

6. 跨模块访问Error错误异常

抛出模块test-home提供的Error错误异常

import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';@Local()
export class LocalWork extends BeanBase<ScopeModule> {async action({ user }) {const scopeHome = this.getScope('test-home');
+   scopeHome.error.Error001.throw();return scopeHome.local.home.action({ user });// return user;}
}
  1. 直接通过scopeHome抛出错误异常Error001

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

在这里插入图片描述

后记

CabloyJS采用ioc和依赖查找的机制,让ts的使用达到了化类型于无形的最佳境界,从而让我们的代码保持优雅和简洁,进而也能显著提升开发效率,保证代码质量

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Vue文学名著分享系统(源码+文档+部署+讲解)

一.系统概述 随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理…

C++拷贝构造函数

1.声明 语法&#xff1a;函数名&#xff08;类名&#xff09;(const 类名 &对象名) 作用&#xff1a;使用一个对象初始化另一个对象。 注意&#xff1a;拷贝构造函数的参数列表必须是 const 类名 & 对象名。 #include <iostream> using namespace std; class …

sonarQube之Call “Optional#isPresent()“ before accessing the value.

在迁移其他项目并使用sonarQube进行规范扫描的时候出现了 Call “Optional#isPresent()” before accessing the value. 解决&#xff1a;这是因为在获取到之前避免空值&#xff1b; 修改前代码&#xff1a; BigDecimal totalAmount feeList.stream().map(FeeDetailDTO::ge…

深刻理解企业的基本职能 营销与创新

前言 还是读《敏捷营销》心得&#xff0c;同样的因最近在读关于营销方面的书与在学习AI&#xff0c;书中有一个引用&#xff0c;即引用彼得德鲁克大师在他的经典著作《客理的实践》中明确提出&#xff1a;由于企业的目的是创造顾客&#xff0c;任何企业都有两项职能&#xff0c…

稀碎从零算法笔记Day45-LeetCode:电话号码的字母组合

题型&#xff1a;映射、回溯算法、递归 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出…

人工智能分类算法概述

文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式&#xff0c;将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用&#xff0c;如图…

网工内推 | 安全运维、服务工程师,软考中级、CISP优先,六险一金

01 华成峰科技 招聘岗位&#xff1a;安全运维工程师 职责描述&#xff1a; 1、负责安全产品的运维管理&#xff0c;包括设备升级变更、策略配置优化、设备巡检等&#xff1b; 2、负责7*24小时安全监控与应急响应&#xff0c;包括态势感知日志监测、安全事件分析及处置等&#…

idea工具使用Tomcat创建jsp 部署servlet到服务器

在tomcat官网中下载对应windows版本的tomcat文件 Apache Tomcat - Welcome! 解压到系统目录中&#xff0c;记得不要有中文路径 新建一个java项目 点击右上角 点击加号 找到Tomcat Service的 Local 点击右下角的Fix一下&#xff0c;然后ok关闭 再重新打开一次 点击deployment …

SQL注入利用 学习- 布尔盲注

布尔盲注适用场景&#xff1a; 1、WAF或者过滤函数完全过滤掉union关键字 2、页面中不再回显具体数据&#xff0c;但是在SQL语句执行成功或失败返回不同的内容 代码分析&#xff1a;过滤关键字 union if(preg_match(/union/i, $id)) { echo "fail"; exit; } 代码…

cmocka入门教程

文章目录 摘要前言什么是mockmock示例cmocka安装使用mock function替换subfunction控制mock function的输入和输出 摘要 本文介绍cmocka中&#xff0c;mock的使用。 前言 在这之前&#xff0c;需要了解最基本的cmocka使用。如果之前有gtest的编程经验&#xff0c;掌握cmocka的…

Docker 安装 ElasticSearch 及 挂载目录

1 拉取ES镜像 docker pull elasticsearch:7.7.0 2 安装临时ES容器&#xff0c;用于拷贝挂载文件 docker run --name es -d -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -e "discovery.typesingle-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0 3 拷贝挂载…

Vue之列表渲染

总的来说&#xff0c;列表渲染中key最好选择数据中唯一&#xff01;尽量不要默认index <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

Node2Vec论文翻译

node2vec: Scalable Feature Learning for Networks node2vec&#xff1a;可扩展的网络特征学习 ABSTRACT 网络中节点和边缘的预测任务需要在学习算法使用的工程特征上付出仔细的努力。最近在更广泛的表示学习领域的研究通过学习特征本身在自动化预测方面取得了重大进展。然…

我认识的建站公司老板都躺平了,每年维护费都大几十万。

这些老板们过的悠哉游哉&#xff0c;大富大贵没有&#xff0c;达到中产&#xff0c;活得舒服&#xff0c;没毛病。 企业官网每年需要交维护费主要是因为以下几个原因&#xff1a; 网站服务器和域名费用&#xff1a;企业官网需要通过服务器进行托管和访问&#xff0c;同时需要…

第一个Swift程序

要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…

基于SSM+Jsp+Mysql的农产品供销服务系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

UVA10935 Throwing cards away I 卡片游戏 解题报告

UVA10935 Throwing cards away I 卡片游戏 解题报告 题目链接 https://vjudge.net/problem/UVA-10935 题目大意 桌上有n&#xff08;n≤50&#xff09;张牌&#xff0c;从第一张牌&#xff08;即位于顶面的牌&#xff09;开始&#xff0c;从上往下依次编号为1&#xff5e;n。…

蓝桥杯第十二届c++大学B组详解

目录 1.空间 2.直线 3.路径 4.卡片 5.货物摆放 6.时间显示 7.砝码称重 8.杨辉三角 9.双向排序 10.括号序列 1.空间 题目解析&#xff1a;1Byte 8bit 1kb 1024B 1MB 1024kb; 先将256MB变成Byte 256 * 1024 * 1024; 再将32位 变成Byte就是 32 / 8 4&#xff1b;…

三种常见webshell工具的流量特征分析

又来跟师傅们分享小技巧了&#xff0c;这次简单介绍一下三种常见的webshell流量分析&#xff0c;希望能对参加HW蓝队的师傅们有所帮助。 什么是webshell webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、…

C++ switch 语句 范围语法

switch 语句通常用于处理离散的值&#xff0c;而不是范围。不过&#xff0c;可以通过 case 中的逻辑或条件来实现类似范围的效果。 switch (tps) {case 6 ... 7:qDebug() << "HttpCount tps limit >5";break;case 8 ... 9:qDebug() << "HttpCou…