Как вызвать метод класса, который имеет внедрение зависимостей в петле 4 (typescript)?

#typescript #dependency-injection #loopback4

#typescript #внедрение зависимостей #loopback4

Вопрос:

 export class CronController {
    constructor(
        @service() public syncService: SyncService,
    ) { }

    async cron() {
        this.syncService.pitSyncCompanies();
    }
}   

@injectable({scope: BindingScope.TRANSIENT})
      export class SyncService {
        constructor(
            @repository(CompanyRepository) public companyRepository: CompanyRepository,
        ) { }
    
        async pitSyncCompanies() {
            console.log('Hi');
        }
    }
 

Как мне создать экземпляр CronController, чтобы вызвать метод cron()?
Я не могу просто создать object = new CronController(), поскольку его конструктор принимает аргументы, и я не уверен, что передать здесь.
Как вызвать метод класса, который имеет внедрение зависимостей в петле 4 (typescript)?

Комментарии:

1. this. syncService.pitSyncCompanies() . Не уверен, как внедрение зависимостей связано с вопросом..

2. Я изменил вопрос. Здесь, как мне создать объект CronController? Потому что его конструктору нужен @service() public SyncService: SyncService

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

Ответ №1:

Обычно фреймворк запускает «начальное разрешение» привязки (например, в HTTP-запросе фреймворк разрешает соответствующий контроллер REST, который затем запускает дерево разрешений для необходимых зависимостей).

Если вы хотите «запустить» разрешение самостоятельно (т. Е. Без каких-либо триггеров из самой платформы), вы, вероятно, ищете createProxyWithInterceptors() . Это полезно в тех редких случаях, когда код, который вы пишете, находится вне контекста.

Например:

 // This does not bind `CronController` to Context.
// It also assumes that the Context has the necessary...
// bindings already added to it (i.e. `SyncService`).

// If the app already depends on `@loopback/core`, import...
// from that package instead for consistency. `@loopback/core`...
// re-exports `@loopback/context`.

import {createProxyWithInterceptors} from '@loopback/context';

createProxyWithInterceptors(CronController, myContextHere);
 

Следует отметить, что возвращаемое значение этой функции является AsyncProxy, которое не является строго совместимым по типу с исходным классом.

Важно, что это не обязательно для большинства вариантов использования и в основном предназначено для пользовательских серверных реализаций.

В типичном проекте REST, использующем @loopback/rest встроенную серверную реализацию, вы бы разрешили CronController в контроллере REST следующим образом:

 // This example uses Constructor Injection, but Property- and Parameter Injection are supported as well.
// This example also assumes that `CronController` was bound using `this.add(createBindingFromClass(CronController))` in the Application/Context constructor
export class MyRESTController {
  constructor(
    @inject(CronController)
    cronController: CronController
  ) { }
}