Angular类库间依赖Toastr的服务调用报NG0203错误求助
Angular类库AlertService注入上下文错误(NG0203)解决
问题场景
在Angular类库项目中实现了依赖ngx-toastr的AlertService,已在类库模块ComplCommonLibModule中导入BrowserAnimationsModule、ToastrModule并将AlertService配置为提供者,但在消费项目中引入该类库并调用AlertService时,出现以下错误:
Error: NG0203: inject() must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with runInInjectionContext.
相关代码如下:
类库服务代码
import { Injectable } from '@angular/core'; import { ToastrService } from 'ngx-toastr'; @Injectable({ providedIn: 'root' }) export class AlertService { constructor(private toastr: ToastrService) { } showSuccess() { this.toastr.success('Hello world!', 'Toastr fun!'); } }
类库模块代码
import { NgModule } from '@angular/core'; import { ComplCommonLibComponent } from './compl-common-lib.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ToastrModule } from 'ngx-toastr'; import { AlertService } from './services/alert.service'; @NgModule({ declarations: [ ComplCommonLibComponent ], imports: [ BrowserAnimationsModule, ToastrModule.forRoot() ], providers:[AlertService], exports: [ ComplCommonLibComponent ] }) export class ComplCommonLibModule { }
消费项目模块代码
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { ComplCommonLibModule } from 'compl-common-lib'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ToastrModule } from 'ngx-toastr'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, AppRoutingModule, BrowserAnimationsModule, ToastrModule.forRoot(), ComplCommonLibModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
消费项目组件代码
import { Component } from '@angular/core'; import { AlertService } from 'compl-common-lib'; @Component({ selector: 'app-root', templateUrl: './app.component.html', standalone: false, styleUrl: './app.component.scss' }) export class AppComponent { title = 'comp-autotn'; constructor(private libService: AlertService){ libService.showSuccess(); } }
错误原因
- 服务注册冲突:
AlertService同时通过@Injectable({ providedIn: 'root' })和类库模块的providers数组注册,导致Angular创建多个服务实例,注入上下文混乱。 - 全局模块重复导入:类库和消费项目都导入了
BrowserAnimationsModule和ToastrModule.forRoot(),引发依赖注入的上下文冲突。
解决方案
1. 统一服务注册方式
删除类库模块中providers数组里的AlertService,保留@Injectable中的providedIn: 'root'(推荐单例模式):
修改后的类库模块代码:
import { NgModule } from '@angular/core'; import { ComplCommonLibComponent } from './compl-common-lib.component'; import { ToastrModule } from 'ngx-toastr'; @NgModule({ declarations: [ ComplCommonLibComponent ], imports: [ ToastrModule ], exports: [ ComplCommonLibComponent ] }) export class ComplCommonLibModule { }
2. 优化全局模块导入策略
类库不应强制导入全局模块(如BrowserAnimationsModule、ToastrModule.forRoot()),改为由消费项目负责全局配置:
- 类库模块仅导入
ToastrModule(不调用forRoot()) - 消费项目中保留
BrowserAnimationsModule和ToastrModule.forRoot()的导入,确保全局配置唯一
3. 验证依赖一致性
确保类库和消费项目的@angular/core、ngx-toastr等依赖版本一致,避免版本差异导致的注入上下文问题。
验证步骤
- 重新打包类库项目
- 更新消费项目中类库的依赖版本
- 启动消费项目,调用
AlertService验证功能正常
内容的提问来源于stack exchange,提问作者Prabhakar
相关产品推荐
相关产品推荐

