如何覆盖注入到角度组件的服务

时间:2018-10-16 07:45:11

标签: angular angular-components angular-dependency-injection

我们正在使用Angular构建一个由cms驱动的应用程序框架。我们提供了多个软件包,客户可以使用它们进一步定制ui或逻辑。出于这个原因,组件会将其逻辑委托给服务,预期的客户可以提供定制服务(我们避免了组件继承)。

将动态放置组件,并使用保持CMS数据的唯一数据集进行初始化。提供的服务将从组件注入器继承此数据。这很好用,但是,当提供自定义服务(使用InjectionToken)时,我们会遇到2个问题:

  1. 该服务不再是非单一服务,将为同一个自定义服务提供多个组件实例
  2. 该服务将不再从组件继承数据值,因为它是在其他范围内注入的

还有其他人遇到过类似的架构挑战吗?

1 个答案:

答案 0 :(得分:0)

看起来像您想要的不是直接提供者。似乎您想要的是一家工厂,它将成为实际的提供者,然后它将具有一个create方法,该方法将为您返回不是单例的实际服务的实例。

类似

@Injectable()
export class MyPFactory {
  public create(): MyP {
    return new MyP();
  }
}

通过这种方式,您可以获得可重复使用的服务,而不必全神贯注地进行单元测试,而且单元测试可能更清洁。我不会说这是严格的解决方案,只是我多次使用它来解决您的问题的方式。

通过这种方式,MyP不需要装饰为Injectable,因为工厂将通过在要使用它的组件/指令中调用create方法来创建MyP。

https://en.wikipedia.org/wiki/Factory_method_pattern