Loopback 4(TypeScript)中如何实例化带依赖注入的类并调用方法
Loopback 4 调用带依赖注入类方法的解决方案
核心逻辑
Loopback 4 基于IoC容器实现依赖注入,所有带
@injectable、@controller、@service、@repository等装饰器的类,依赖都会由容器自动注入,不需要手动实例化传参。
常用实现方案
- 方案1:从应用容器直接获取实例(通用)
如果可以拿到Loopback应用实例对象(比如应用启动脚本、自定义逻辑中),直接通过get方法从容器获取已经完成依赖注入的实例即可:
// app为你初始化的Loopback应用实例 const cronController = await app.get<CronController>('controllers.CronController'); // 直接调用目标方法 await cronController.cron();
如果需要直接调用Service的方法也可以直接获取Service实例:
const syncService = await app.get<SyncService>('services.SyncService'); await syncService.pitSyncCompanies();
- 方案2:通过生命周期观察者注册定时任务(最适配Cron场景)
你当前的需求是定时触发Cron任务,更推荐用Loopback4的生命周期钩子实现,容器会自动处理所有依赖:
- 定义生命周期观察者类
import { LifeCycleObserver, lifeCycleObserver, CoreBindings, inject, Application } from '@loopback/core'; import { CronController } from './cron.controller'; // 引入你用的定时任务库,比如node-cron import * as cron from 'node-cron'; @lifeCycleObserver('server') export class CronJobObserver implements LifeCycleObserver { constructor( @inject(CoreBindings.APPLICATION_INSTANCE) private app: Application, ) {} // 应用启动完成后自动执行该方法 async start() { const cronController = await this.app.get<CronController>('controllers.CronController'); // 配置定时规则触发cron方法,示例为每分钟执行一次 cron.schedule('* * * * *', () => { cronController.cron(); }); } }
- 在你的
application.ts中注册该观察者
this.lifeCycleObserver(CronJobObserver);
- 方案3:手动实例化(不推荐)
如果特殊场景必须手动new实例,需要手动补齐所有嵌套依赖:
// 先实例化Repository,需要传入它的依赖比如数据源 const companyRepository = new CompanyRepository(/* 传入Repository所需参数 */); // 实例化Service,传入Repository const syncService = new SyncService(companyRepository); // 实例化Controller,传入Service const cronController = new CronController(syncService); // 调用方法 await cronController.cron();
该方式需要自己维护完整依赖链,依赖层级多的时候维护成本极高,非特殊情况不建议使用。
内容的提问来源于stack exchange,提问作者user2869736
相关产品推荐
相关产品推荐

