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

如何创建每次调用返回唯一实例的服务?Angular是否有替代方案?

如何让Angular服务每次调用返回唯一实例

官方推荐的优雅解决方案

不需要用继承或重复导出这类冗余方案,Angular本身提供了几种符合DI设计理念的方式实现每次注入返回新实例:

  1. 使用providedIn: 'any'配置
    在@Injectable装饰器中设置providedIn: 'any',Angular会为每个不同的注入上下文(比如懒加载模块、独立组件的注入器)创建新的服务实例:
@Injectable({
  providedIn: 'any'
})
export class UniqueInstanceService {
  // 服务业务逻辑
}

这是官方最推荐的方式,既保留了依赖注入的优势,又能自动在不同上下文生成新实例。

  1. 组件/指令级别声明服务
    如果只需要在特定组件及其子组件范围内每次获取新实例,可以在组件的providers数组中声明服务:
@Component({
  selector: 'app-target-component',
  templateUrl: './target-component.component.html',
  providers: [UniqueInstanceService] // 每个组件实例对应一个新服务实例
})
export class TargetComponent {
  constructor(private service: UniqueInstanceService) {}
}

这种方式会让每个组件实例都拥有独立的服务实例,适合组件级别的状态隔离需求。

  1. 工厂函数手动控制实例创建
    如果需要自定义实例初始化逻辑(比如注入依赖后再创建实例),可以通过工厂函数实现:
@Injectable()
export class UniqueInstanceService {
  constructor(private dep: SomeDependencyService) {}
}

// 在模块或组件的providers中配置
providers: [
  SomeDependencyService,
  {
    provide: UniqueInstanceService,
    useFactory: (dep: SomeDependencyService) => new UniqueInstanceService(dep),
    deps: [SomeDependencyService]
  }
]

每次注入时都会执行工厂函数生成新实例,适合需要灵活控制实例创建流程的场景。

不推荐的方案说明

  • 继承类无法解决实例唯一性问题,除非每次手动实例化子类,但这会增加代码冗余,且脱离Angular的依赖注入体系。
  • 重复导出同一个类完全无效,本质还是同一个类的单例(除非手动new,但这会丢失DI的依赖注入能力)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:27:28