【发布时间】:2018-11-02 12:06:49
【问题描述】:
在 Angular 5 中,如果我有扩展抽象的 AbstractClassService 和 ExtendedClassService,我可以在 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