Каким образом служба с возможностью разделения на деревья избегает циклической c зависимости, тогда как pre- Angular 6 DI - нет? - PullRequest
1 голос
/ 13 февраля 2020

Прежде всего, я создаю функцию для передачи в 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. А как получилось? Не должно ли это произойти с ошибкой циклической зависимости, как в первом примере? Разве это не должно работать так же? Я не могу получить это.

Вот блиц , который вы можете запустить.

...