环回4中正确实现提供者

时间:2019-04-30 21:48:42

标签: typescript strongloop loopback

我一直在尝试在Loopback 4中围绕提供者和装饰者,但我很难理解它。

  1. 提供者的主要目的是什么?
  2. 仅用于序列还是可以在其他地方使用?
  3. 是否有要遵循的模板?
  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
  }
}

这是一种准确的方法吗?能更干净吗?

1 个答案:

答案 0 :(得分:1)

  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';
  }
}

  1. 它可以在LB4应用程序中用于支持任何类型的绑定,而不仅限于操作。

  2. 您可以在loopback-next存储库中找到示例

  3. Provider必须是一个类,以便可以将装饰器应用于依赖项注入。可以修饰构造函数的参数和属性。