我一直在尝试在Loopback 4中围绕提供者和装饰者,但我很难理解它。
我当前的实现如下所示:
export interface MyProviderFn {
(args: any[]): Promise<void>;
}
export class MyActionProvider implements Provider<MyProviderFn> {
public constructor(
@inject(CoreBindings.APPLICATION_INSTANCE)
public app: RestApplication,
@inject.getter(CoreBindings.CONTROLLER_CLASS, { optional: true })
private readonly getController: Getter<Constructor<{}>>,
@inject.getter(CoreBindings.CONTROLLER_METHOD_NAME, { optional: true })
private readonly getMethod: Getter<string>,
) {}
public value(): MyProviderFn {
return args => this.action(args);
}
public async action(args: any[]): Promise<void> {
const controllerClass = await this.getController();
const methodName = await this.getMethod();
if (!controllerClass || !methodName) return;
const metadata = getDecoratorMetadata(controllerClass, methodName);
if (!metadata) {
return;
}
// Provider specific code here
}
}
这是一种准确的方法吗?能更干净吗?
答案 0 :(得分:1)
在LoopBack 4中,提供程序解决了依赖项注入的以下问题:
binding.to()
)binding.toDynamicValue()
)binding.toClass()
)例如:
class GreetingProvider implements Provider<string> {
// Inject the current language
private constructor(@inject('language') private lang: string) {
}
// Produce resolved value for the binding
value() {
if (this.lang === 'zh') return '你好';
else return 'Hello';
}
}
它可以在LB4应用程序中用于支持任何类型的绑定,而不仅限于操作。
您可以在loopback-next存储库中找到示例
Provider必须是一个类,以便可以将装饰器应用于依赖项注入。可以修饰构造函数的参数和属性。