如何创建每次调用返回唯一实例的服务?Angular是否有替代方案?
如何让Angular服务每次调用返回唯一实例
官方推荐的优雅解决方案
不需要用继承或重复导出这类冗余方案,Angular本身提供了几种符合DI设计理念的方式实现每次注入返回新实例:
- 使用
providedIn: 'any'配置
在@Injectable装饰器中设置providedIn: 'any',Angular会为每个不同的注入上下文(比如懒加载模块、独立组件的注入器)创建新的服务实例:
@Injectable({ providedIn: 'any' }) export class UniqueInstanceService { // 服务业务逻辑 }
这是官方最推荐的方式,既保留了依赖注入的优势,又能自动在不同上下文生成新实例。
- 组件/指令级别声明服务
如果只需要在特定组件及其子组件范围内每次获取新实例,可以在组件的providers数组中声明服务:
@Component({ selector: 'app-target-component', templateUrl: './target-component.component.html', providers: [UniqueInstanceService] // 每个组件实例对应一个新服务实例 }) export class TargetComponent { constructor(private service: UniqueInstanceService) {} }
这种方式会让每个组件实例都拥有独立的服务实例,适合组件级别的状态隔离需求。
- 工厂函数手动控制实例创建
如果需要自定义实例初始化逻辑(比如注入依赖后再创建实例),可以通过工厂函数实现:
@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
相关产品推荐
相关产品推荐

