You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
  }
}

错误原因

  1. 服务注册冲突:AlertService同时通过@Injectable({ providedIn: 'root' })和类库模块的providers数组注册,导致Angular创建多个服务实例,注入上下文混乱。
  2. 全局模块重复导入:类库和消费项目都导入了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等依赖版本一致,避免版本差异导致的注入上下文问题。

验证步骤

  1. 重新打包类库项目
  2. 更新消费项目中类库的依赖版本
  3. 启动消费项目,调用AlertService验证功能正常

内容的提问来源于stack exchange,提问作者Prabhakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:15:18