比nestjs更優雅的ioc:跨模組訪問資源

濮水大叔發表於2024-04-10

使用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站直播:濮水程式碼

相關文章