
在项目中使用 ts 可以带来类型智能提示与校验的诸多好处。同时,为了减少类型标注,达到化类型于无形的效果,CabloyJS 引入了 ioc 和依赖查找的机制。在上一篇文章中,我们创建了一个业务模块 test-home ,并且采用依赖查找的机制演示了如何优雅的定义和使用资源,包括:Service 服务、Config 配置、国际化语言资源、Error 错误异常
在实际的项目当中,经常会遇到跨模块访问资源的场景,那么,CabloyJS 的依赖查找机制是否仍然可以优雅的实现跨模块访问呢?让我们一睹为快
CabloyJS 全栈框架的前后端均采用模块化体系。一个 CabloyJS 项目由多个业务模块组成,每个业务模块都可以包含与自身业务相关的资源,比如:Service 服务、Config 配置、国际化语言资源、Error 错误异常、中间件、定时任务、消息队列、系统启动项,等等
在这里,我们创建一个新的业务模块 test-work ,在 test-work 中访问 test-home 提供的资源
cabloy api:create:module test-work 通过一个命令同时创建一组文件:Route 、Controller 、Service
cabloy api:create:controller work 接下来,我们在刚才新建的 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; } } home看一下动画演示,提供了完整的类型智能提示:
访问模块 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; } } 看一下动画演示,提供了完整的类型智能提示:
访问模块 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; } } 看一下动画演示,提供了完整的类型智能提示:
抛出模块 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; } } 看一下动画演示,提供了完整的类型智能提示:
CabloyJS 采用 ioc 和依赖查找的机制,让 ts 的使用达到了化类型于无形的最佳境界,从而让我们的代码保持优雅和简洁,进而也能显著提升开发效率,保证代码质量
欲了解更多,请关注每晚 8 点 B 站直播:濮水代码
1 calmbinweijin 2024-04-11 12:50:37 +08:00 没说清楚,但是感觉有点意思 |
2 arfaWong 2024-04-11 13:44:17 +08:00 看标题进来还以为 anyscript 呢,哈哈哈哈 |
4 encro 2024-04-11 15:26:39 +08:00 难道这个框架是我这个问题的答案? t/1026896#reply7 |
5 encro 2024-04-11 15:28:47 +08:00 不过你这写法,让跨模块失去了意义呢。 |
8 encro 2024-04-11 15:53:36 +08:00 @zhennann 模块化的意义在于只通过模块的接口去访问, 如果可以任意访问模块的方法或者数据,就失去模块化黑箱的意义了吧,没有达到解耦的目的。 我通过例子是没看出这种模块化的意义。 当然可能是因为 config 和 error 都属于 base 模块。 |
9 zhennann OP @encro 如果只通过接口访问模块的资源,更好的方案应该是微服务 在一个大型项目中,模块的资源不只有 api 接口,config 和 error 资源也可以按照模块隔离,这样可以让与某个业务相关的资源代码充分自治 |
10 encro 2024-04-11 16:42:16 +08:00 @zhennann 在一个大型项目中,模块的资源不只有 api 接口,config 和 error 资源也可以按照模块隔离,这样可以让与某个业务相关的资源代码充分自治 是这样没错,所以这样直接访问,就又变成了不自治了,不是吗? |