Предоставьте уникальный экземпляр службы в каждом компоненте - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть ситуация, когда я хочу иметь возможность использовать несколько компонентов виджета одновременно на странице.Я хочу изолировать зависимости ContainerComponent, чтобы каждый экземпляр ContainerComponent ссылался на уникальные экземпляры службы.

Например, я бы хотел, чтобы каждый экземпляр следующего компонента имел уникальный экземпляр «FhirService»:

export class ContainerComponent implements OnInit, OnDestroy, AfterViewInit {
...
constructor(private _fhir: FhirService, private _questionnaireService: QuestionnaireService, private cdr: ChangeDetectorRef) {}

Определение службы:

@Injectable({
  providedIn: 'root'
})
export class FhirService {
  public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;

  constructor(private _http: HttpClient, private _settingsService: SettingsService) {
    this.guidanceResponseBS = new BehaviorSubject<GuidanceResponse>(null);
  }

...

Какэто сделано?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Если вы хотите предоставить уникальный экземпляр службы для другого компонента, вам нужно будет добавить службу В декораторе @Component () для компонента. Вы должны добавить эти службы в массив поставщиков для дочернего модуля.объявления или объявление компонента:

Вы можете настроить инжекторы с поставщиками на разных уровнях вашего приложения, установив значение метаданных в одном из трех мест:

В @Injectable () для самого сервиса.

В декораторе @NgModule () для модуля NgModule.

В декораторе @Component () для компонента.

Пример:

 @Component({
  selector: 'app-hero-list',
  template: `
    <div *ngFor="let hero of heroes">
      {{hero.id}} - {{hero.name}}
    </div>
  `,
 providers: [myService]
})
0 голосов
/ 04 декабря 2018

Начнем с того, что вам не нужно иметь более одного экземпляра службы на английском языке.Это структура DI, и поэтому вы должны (в большинстве случаев) иметь один экземпляр каждой службы.

То, что может привести вас к мысли, что в конечном итоге вам понадобятся определенные / отдельные экземпляры службы для каждого класса, заключается в том, что с утверждением:

public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;

вы объединяете концепцию данные (состояние) с данными business logic.Ваши сервисы не должны содержать / сохранять данные, по крайней мере, не те, которые вы намеревались назвать business logic.

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

...