在每个组件中提供唯一的服务实例
Provide Unique Service Instance in Every Component
我有一种情况,我希望能够在页面上同时使用多个小部件组件。我想隔离 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);
}
...
这是怎么做到的?
首先,您不需要在 angular 中拥有多个服务实例。它是一个 DI 框架,因此您(在大多数情况下)应该有每个服务的单个实例。
可能导致您认为您最终需要为每个 class 提供服务的 specific/separate 个实例的原因是:
public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;
您正在将 数据(状态)的概念与 business logic
的概念相结合。您的服务不应该 contain/save 数据,至少不是您想要的 business logic
数据。
现在,也有包含数据的服务,但这样做通常是为了在应用程序中的更多组件之间共享数据。通常,在这些情况下,您会在同一阶段加载数据并将其保存在服务中以供将来使用。
如果你想为不同的组件提供唯一的服务实例,你必须添加服务在组件的@Component()装饰器中。你应该添加这些服务到子模块声明的提供程序数组或到组件声明:
You can configure injectors with providers at different levels of your
app, by setting a metadata value in one of three places:
In the @Injectable() decorator for the service itself.
In the @NgModule() decorator for an NgModule.
In the @Component() decorator for a component.
EX:
@Component({
selector: 'app-hero-list',
template: `
<div *ngFor="let hero of heroes">
{{hero.id}} - {{hero.name}}
</div>
`,
providers: [myService]
})
我有一种情况,我希望能够在页面上同时使用多个小部件组件。我想隔离 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);
}
...
这是怎么做到的?
首先,您不需要在 angular 中拥有多个服务实例。它是一个 DI 框架,因此您(在大多数情况下)应该有每个服务的单个实例。
可能导致您认为您最终需要为每个 class 提供服务的 specific/separate 个实例的原因是:
public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;
您正在将 数据(状态)的概念与 business logic
的概念相结合。您的服务不应该 contain/save 数据,至少不是您想要的 business logic
数据。
现在,也有包含数据的服务,但这样做通常是为了在应用程序中的更多组件之间共享数据。通常,在这些情况下,您会在同一阶段加载数据并将其保存在服务中以供将来使用。
如果你想为不同的组件提供唯一的服务实例,你必须添加服务在组件的@Component()装饰器中。你应该添加这些服务到子模块声明的提供程序数组或到组件声明:
You can configure injectors with providers at different levels of your app, by setting a metadata value in one of three places:
In the @Injectable() decorator for the service itself.
In the @NgModule() decorator for an NgModule.
In the @Component() decorator for a component.
EX:
@Component({
selector: 'app-hero-list',
template: `
<div *ngFor="let hero of heroes">
{{hero.id}} - {{hero.name}}
</div>
`,
providers: [myService]
})