Правильная реализация провайдеров в Loopback 4 - PullRequest
1 голос
/ 01 мая 2019

Я пытался обернуть голову вокруг провайдеров и декораторов в 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 Ответ

1 голос
/ 10 мая 2019
  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 для поддержки любых видов привязок, не ограничиваясь действиями.

Примеры можно найти в повторном цикле репо

Поставщик должен быть классом, чтобы декораторы могли применяться для внедрения зависимостей.Параметры и свойства конструктора могут быть декорированы.

...