#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
) { }
}