【问题标题】:Angular 6 providedIn - how to customize the @Injectable() provider for dependency injection?Angular 6 providedIn - 如何自定义 @Injectable() 提供程序以进行依赖注入?
【发布时间】:2018-11-02 12:06:49
【问题描述】:

在 Angular 5 中,如果我有扩展抽象的 AbstractClassServiceExtendedClassService,我可以在 NgModule 的 providers 数组中执行此操作:

@NgModule({
  providers: [
    {provide: AbstractClassService, useClass: ExtendedClassService}
  ]
})
export class AppModule {}

这将允许我将ExtendedClassService 与另一个切换以进行测试或任何非常容易的事情。这仍然可以使用 Angular 6 完成,但是可以在服务本身中设置新的 providedIn 选项以减小包大小:

@Injectable({providedIn: 'root'})
export class ExtendedClassService extends AbstractClassService {}

有没有办法让我在使用新的providedIn 时完成与Angular 5 相同的事情?像这样的:

@Injectable({providedIn: 'root', provide: AbstractClassService})
export class ExtendedClassService extends AbstractClassService {}

【问题讨论】:

  • providedIn 仅用于定位注入器,该注入器将负责注入 ExtendedClassService 类的实例,为此它将是根注入器。如果您不想要根注入器,您可以指定任何其他模块。然后服务实例将由包含该模块的注入器创建。
  • 如果要动态创建实例,可以使用useFactory提供负责创建实例的工厂函数。
  • 我不认为有可能以较新的 TreeShakable 提供程序创建语法 (provideIn) 为现有提供程序提供替代实现...请查看此博客它已经涵盖了大部分内容softwarearchitekt.at/post/2018/05/06/…
  • @Niladri 我确实希望根注入器负责注入服务,但我希望它使用令牌AbstractClassService——因为这是注入组件的内容——而不是@ 987654334@

标签: angular dependency-injection angular-module


【解决方案1】:

我需要做两件事。

首先,在创建继承类时使用implements 而不是extends,并且不要在那里使用providedIn 键:

@Injectable() // removed providedIn
export class ExtendedClassService implements AbstractClassService {}

其次,将提供者指令添加到抽象类中:

@Injectable({providedIn: 'root', useClass: ExtendedClassService})
export abstract class AbstractClassService {}

其他提供者配置(useValueuseExistinguseFactory)也可以在那里使用。

this comment 归功于 Abinesh,这让我找到了the linked blog post。非常感谢博主!

【讨论】:

  • 如果ExtendedClassService 有任何依赖,例如HttpClient,必须将它们添加到 AbstractClassService 装饰器中:deps: [HttpClient]
  • 如果您将服务放在单独的文件中,这会产生循环引用。烦人
  • 如果基类不是我们的怎么办,比如Angular coreErrorHandler 类?
  • @EvAlex。如果您实际上只在单独的文件中导出/导入类名称,则可以避免循环引用(依赖项)。如果您尝试共享变量或枚举,您将获得通告。我遇到了这个问题并通过将任何共享变量移动到一个单独的文件来解决它。 (在我的例子中,它只是一个 Enum,我将它移到了它自己的文件中)。
  • 您甚至可以完全省略ExtendedClassService 中的@Injectable()
猜你喜欢
  • 2016-04-23
  • 2021-08-28
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多