演示

服务注解

用 @Service() 声明可注入服务,并在模块 providers 中注册。不支持构造函数注入。

@Service

  • @Service() — 在插件 DI 容器中注册一个单例可注入服务
  • 将该类加入 @Module({ providers: [...] })

@Inject

仅使用属性 @Inject — 不支持构造函数注入。@Inject(Service) 为同插件;@Inject(Service, "other-plugin") 为跨插件。

  • @Inject(MyService) — 从当前插件注入
  • @Inject(MyService, "other-plugin") — 从其他插件注入
TSXinject
1import { 2 Controller, 3 Inject, 4 PartnerService, 5} from "@quan-erp/shared-backend-core"; 6import { RewardPointService } from "./reward-point.service.js"; 7 8@Controller("/reward-point") 9export class RewardPointController { 10 @Inject(RewardPointService) 11 service: RewardPointService; 12 13 // cross-plugin 14 @Inject(PartnerService, "base") 15 partnerService: PartnerService; 16}

循环服务注入

互相 import + @Inject(OtherService) 可能触发 ESM TDZ。使用懒引用与 InstanceType,避免 design:type 直接指向类。

TSXlazy inject
1import { Inject, Service, UserService } from "@quan-erp/shared-backend-core"; 2 3@Service() 4export class ChangeLogService { 5 @Inject(() => UserService) 6 userService: InstanceType<typeof UserService>; 7}

示例

TSXservice
1import { Service } from "@quan-erp/shared-backend-core"; 2 3@Service() 4export class LocationService { 5 async list() { 6 // domain logic 7 } 8}