【问题标题】:Provide Unique Service Instance in Every Component在每个组件中提供唯一的服务实例
【发布时间】:2018-12-04 20:24:26
【问题描述】:

我有一种情况,我希望能够在页面上同时使用多个小部件组件。我想隔离 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 angular-dependency-injection


【解决方案1】:

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

您可以使用不同级别的提供程序来配置注入器 应用程序,通过在三个位置之一设置元数据值:

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

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

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

前:

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

【讨论】:

  • 谢谢,这很酷,只要知道如果你发现并实现了这个,你需要在你的单元测试中更新你的 TestBed 配置来遵循这个:stackoverflow.com/a/39894266/491436
【解决方案2】:

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

可能会导致您认为您最终需要为每个类拥有一个特定/单独的服务实例的事情是使用以下语句:

public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;

您将 data(状态)的概念与 business logic 的概念结合在一起。您的服务不应该包含/保存数据,至少不是您打算作为business logic 的一次。

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

【讨论】:

  • Angular 中的 DI 框架是专门为允许多个服务实例而设计的……在任何应用程序中都有多个服务实例的许多用例,并且绝大多数 DI 框架都提供了它。 Angular 文档中特别说明了这一点。
  • 它允许,但在你的情况下只是滥用 IMO
  • @NiVeR 不是他的 :)
  • 他不是这个问题的作者 :)
  • 不是我的问题,但如果该状态对于组件的每个实例都是唯一的,则有状态服务是服务的多个实例的潜在用例。这可能是容器组件与子组件通信或共享状态的方式。
猜你喜欢
  • 2018-11-07
  • 2016-07-02
  • 2018-04-14
  • 2019-11-11
  • 2020-11-20
  • 2019-01-17
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多