在每个组件中提供唯一的服务实例

时间:2018-12-04 20:24:27

标签: angular angular-dependency-injection

我遇到一种情况,希望同时在页面上使用多个窗口小部件组件。我想隔离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 :(得分:1)

如果要为不同的组件提供唯一的服务实例,则必须在组件的@Component()装饰器中添加服务。您应将这些服务添加到子组件的provider数组中模块声明或组件声明:

  

您可以在不同级别的提供商处配置注射器   应用程序,方法是在以下三个位置之一中设置元数据值:

     

在服务本身的@Injectable()装饰器中。

     

在NgModule的@NgModule()装饰器中。

     

在组件的@Component()装饰器中。

EX:

 @Component({
  selector: 'app-hero-list',
  template: `
    <div *ngFor="let hero of heroes">
      {{hero.id}} - {{hero.name}}
    </div>
  `,
 providers: [myService]
})

答案 1 :(得分:0)

首先,您不需要在角度中拥有多个服务实例。这是一个DI框架,因此(在大多数情况下)您应该为每个服务拥有一个实例。

可能导致您认为最终需要为每个类提供服务的特定/单独实例的事情是:

public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;

您正在将 data (状态)的概念与business logic的概念相结合。您的服务不应该包含/保存数据,至少不应该包含business logic这样的数据。

现在,还有一些服务将包含数据,但是通常这样做是为了在应用程序的更多组件之间共享数据。通常,在这种情况下,您需要在同一阶段加载数据,然后将其保存在服务中以供将来使用。