Прежде всего, я создаю функцию для передачи в useFactory
:
// circular.factory.ts
export let circularFactory = (instance: MyService) => {
console.log('calling useFactory with:', instance);
return instance || new MyService()
}
Теперь я собираюсь настроить DI так, чтобы служба ссылалась на фабрику и фабрика ссылается на сервис.
Первый сценарий:
Здесь я использовал пре-1045 * 6 DI-способ, сконфигурировав его с массивом providers
в NgModule
моего AppModule
.
// app.module.ts
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [{
deps: [
[MyService]
],
provide: MyService,
useFactory: circularFactory
}]
})
export class AppModule {}
Запуск, который приведет к следующей ошибке:
Ошибка: ошибки синтаксического анализа провайдера: Невозможно создать циклическую c зависимость! MyService ("[ОШИБКА ->]"): в NgModule AppModule в ./AppModule@-1:-1
Что ж, этого следовало ожидать. Действительно, я создал циклическую c зависимость.
Второй сценарий:
На этот раз я настрою DI, используя свойство @Injectable()
providedIn
для ссылки на root.
// my.service.ts
@Injectable({
deps: [
[MyService]
],
providedIn: 'root',
useFactory: circularFactory
})
export class MyService {
constructor() {
console.log('instantiating MyService')
}
}
...
// app.component.ts
@Component({
selector: 'app-component',
template: `
<h1>Oh, hi, there.</h1>
`
})
export class AppComponent {
constructor(public myService: MyService) {
console.log('injecting dependency into AppComponent:', this.myService);
}
}
Как видите, я добавил несколько журналов консоли для отладки. Результаты следующие:
calling useFactory with: undefined
instantiating MyService
injecting dependency into AppComponent:
В отличие от первого случая ему каким-то образом удалось преобразовать токен для useFactory
в undefined
. А как получилось? Не должно ли это произойти с ошибкой циклической зависимости, как в первом примере? Разве это не должно работать так же? Я не могу получить это.
Вот блиц , который вы можете запустить.