使用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站直播:濮水代码

比nestjs更优雅的ioc:跨模块访问资源的更多相关文章

  1. WPF整理-跨程序集访问资源

    “Sometimes binary resources are defined in one assembly (typically a class library), but areneeded i ...

  2. Javascript 跨域访问解决方案 总结

    在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问 ...

  3. GoodReader跨域访问HT for Web手册

    最近下载了GoodReader App,发现GoodReader中打开的页面不仅支持WebGL,同时还允许跨域访问资源,以前不少HT for Web手册的例子需要Web服务器发布的方式才能访问,否则需 ...

  4. cors解决Web跨域访问问题

    首先了解一下什么是跨域以及解决的几种常见方式. 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同. 举例: 相对于 ...

  5. Spring Boot 2中对于CORS跨域访问的快速支持

    原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 ...

  6. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...

  7. STL 跨模块 调用 异常 解决

    本文为转载别人的,以作收藏之用 百度了一天,现在把结论放上边: 1.不要用STL(std::string属于STL)来跨模块传输数据,例如:dll(so)之间,dll(so)和exe(elf)之间. ...

  8. 一种比css_scoped和css_module更优雅的避免css命名冲突小妙招

    css_scoped 与 css_module 我们知道,简单的class名称容易造成css命名重复,比如你定义一个class: <style> .main { float: left; ...

  9. Karmada v1.3:更优雅 更精准 更高效

    摘要:最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服). 本文分享自华为云社区 ...

  10. PostCSS一种更优雅、更简单的书写CSS方式

    Sass团队创建了Compass大大提升CSSer的工作效率,你无需考虑各种浏览器前缀兼,只需要按官方文档的书写方式去写,会得到加上浏览器前缀的代码,如下: .row { @include displ ...

随机推荐

  1. Java 封装性的四种权限测试 + 总结

    *    总结封装性:Java提供了4中权限修饰符来修饰类及类的内部结构,体现类及类的内部结构再被调用时的可见性的大小 1 package com.bytezero.circle; 2 3 publi ...

  2. ThinkPHP6 事件的简单应用

    一.序章 ThinkPHP6的手册中关于[事件]章节的介绍都是直接文字说明,给出创建的类文件,并没有一个好的示例来进行补充说明.对于刚接触[事件]的同学在阅读理解上增加了一点点困难,本文就在此结合示例 ...

  3. 复习精简版快速学vue3

    vue2中.如果给一个之前没有定义的属性赋值,会得不到时实更新: this.obj.b=2 //由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说v ...

  4. [学习笔记]Linux + Nginx环境下部署 Web 站点

    ​部署后端程序,请阅读: [学习笔记]Linux环境下部署 .Net5 程序 - 林晓lx - 博客园 (cnblogs.com) 打包项目 以Vue项目为例,首先打包站点,前往项目的根目录并键入: ...

  5. tapable - webpack 的 hooks - getAc - 异步流程控制

    tapable - webpack 的 hooks,类似自己的 getAc 官方地址 https://www.npmjs.com/package/tapable 随便找了篇文章:聊聊 Webpack ...

  6. ida使用入门指北

    静态分析 快捷键 操作 作用 空格键 在反汇编窗口中,进行列表视图与图形视图之间的切换 TAB 在反汇编窗口中,进行汇编指令与伪代码之间的切换 Esc 和 Ctrl+Enter 翻页,返回前一页面 G ...

  7. 在更新数据的时候,显示一个软件源里面没有Release文件

  8. gcc makefile 模板

    一 基本概况 在做基本的c代码测试的时候,经常会遇到gcc做编译,作为一个工程师,不存点模板,每次都是自己写的话,那不是非常的浪费体力,程序员本来就累了.在这上面浪费不少时间,吃力不讨好啊. 保存一些 ...

  9. day01-项目介绍+SSM环境搭建

    项目介绍+SSM环境搭建 1.项目功能/界面 SSM整合项目界面:使用Vue完成 技术栈:前后端分离开发,前端框架Vue3+后端框架SSM 前端框架-Vue3 后端框架-SSM(SpringMVC+S ...

  10. HISI3520DV300 折腾记录(三)之《终篇》

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...