packages/skills/egg-core/references/dynamic-inject.md
@Inject():依赖只有一个实现,编译时就能确定// AbstractHello.ts
export abstract class AbstractHello {
abstract hello(): string;
}
// HelloType.ts
export enum HelloType {
FOO = 'FOO',
BAR = 'BAR',
}
如果类型是无限扩展的,没有固定枚举,可以用 Record<string, string> 代替:
type AnyEnum = Record<string, string>;
// decorator/Hello.ts
import { ImplDecorator, QualifierImplDecoratorUtil } from 'egg';
import { HelloType } from '../HelloType.ts';
import { AbstractHello } from '../AbstractHello.ts';
export const HELLO_ATTRIBUTE = Symbol('HELLO_ATTRIBUTE');
export const Hello: ImplDecorator<AbstractHello, typeof HelloType> =
QualifierImplDecoratorUtil.generatorDecorator(AbstractHello, HELLO_ATTRIBUTE);
注意事项:
每个实现加上 @SingletonProto()(或 @ContextProto())和自定义装饰器:
// impl/FooHello.ts
import { SingletonProto } from 'egg';
import { Hello } from '../decorator/Hello.ts';
import { HelloType } from '../HelloType.ts';
import { AbstractHello } from '../AbstractHello.ts';
@SingletonProto()
@Hello(HelloType.FOO)
export class FooHello extends AbstractHello {
hello(): string {
return 'hello, foo';
}
}
通过 EggObjectFactory 在运行时按类型获取对应实现:
// HelloService.ts
import { EggObjectFactory, SingletonProto, Inject } from 'egg';
import { HelloType } from './HelloType.ts';
import { AbstractHello } from './AbstractHello.ts';
@SingletonProto()
export class HelloService {
@Inject()
private eggObjectFactory: EggObjectFactory;
async hello(type: HelloType): Promise<string> {
const helloImpl = await this.eggObjectFactory.getEggObject(
AbstractHello,
type,
);
return helloImpl.hello();
}
}