Angular 6服务继承时依赖注入异常问题求助
我来帮你搞定这个Angular服务继承时的依赖注入问题!
为啥会出现这个情况?
你把父类和子类都用@Injectable({ providedIn: 'root' })标记后,Angular的DI系统会搞混:父类已经在根注入器里注册成了单例,子类继承后没明确告诉DI“我要创建自己的实例”,导致DI默认给你返回父类的对象,这就出现了你看到的“请求子类却拿到父类”的问题。
保留摇树优化的解决办法
有两种靠谱的方式,都能让你继续用providedIn带来的摇树优化和测试便利:
方法一:给子类明确指定提供者
在子类的@Injectable装饰器里,加上providers配置,明确告诉DI当请求ChildAppService时,要创建它自己的实例:
@Injectable({ providedIn: 'root', providers: [{ provide: ChildAppService, useClass: ChildAppService }] }) export class ChildAppService extends ParentAppService { // 你的子类业务逻辑 }
方法二:把父类改成抽象类(如果父类不需要单独注入)
如果你的父类只是作为基类存在,不需要被单独注入到组件或其他服务里,那可以把它改成抽象类,并且不给它加providedIn配置:
// 父类改为抽象类,不需要@Injectable的providedIn配置 export abstract class ParentAppService { // 父类的基础逻辑实现 } @Injectable({ providedIn: 'root' }) export class ChildAppService extends ParentAppService { // 子类的业务逻辑实现 }
验证效果
改完之后,你再在组件里注入ChildAppService,就能拿到正确的子类实例了,同时摇树优化和简洁测试的优势也都保留着~
内容的提问来源于stack exchange,提问作者Scott Kirkland
相关产品推荐
相关产品推荐

