作用
- 在 @Service 类的私有(或公开)方法上添加装饰器
- 该方法的返回值会作为单例注册进插件的 DI 容器
- 其他 service / controller 可以通过类型(或返回的类)用 @Inject 获取该实例
- 非常适合封装非自有的库(BullMQ、ioredis、AWS SDK 等)
规则
- 宿主类必须是 @Service(),并出现在模块的 providers 中
- 工厂在 DI 装配阶段执行 — 保持轻量(只创建 client / queue,重活延后)
- 每个 @Bean 方法只返回一个具体实例
- 任何地方都不支持构造函数注入 — 使用方通过属性 @Inject 注入
BullMQ Queue 示例
常见模式:为自定义后台任务暴露一个 Queue。周期性调度请优先使用 CronJobService。
TSXfactory
1import { Queue } from "bullmq";
2import { Bean, Service } from "@quan-erp/shared-backend-core";
3
4@Service()
5export class QueueRegistryService {
6 @Bean()
7 private registerQueue() {
8 return new Queue("my-queue", { connection: redisOptions });
9 }
10}TSXinject consumer
1import { Queue } from "bullmq";
2import { Inject, Service } from "@quan-erp/shared-backend-core";
3
4@Service()
5export class JobPublisherService {
6 @Inject(Queue) // or the concrete token your factory returns
7 private queue: Queue;
8
9 async enqueue(payload: unknown) {
10 await this.queue.add("task", payload);
11 }
12}何时使用
- 适用 — 需要共享单例的 Queue / Worker / Redis / HTTP SDK 客户端
- 适用 — 构造时需要读取 env/config 的适配器
- 不适用 — 普通插件服务(用 @Service + @Inject)
- 不适用 — 定时任务(用 CronJobService,见 Cron job)
最佳实践
- 工厂方法要小巧、命名清晰(registerX / createX)
- 连接配置从 PluginEnv / base env 读取 — 严禁硬编码机密
- 如库需要清理,在 @OnUninstall 中断开连接
- 把宿主 @Service 加入 @Module({ providers }),工厂才会真正执行