繁体   English   中英

避免 Angular 中的多个服务实例

[英]Avoid Multiple Instances of Service in Angular

我在网上做了一些研究,我发现我面临的问题是正在创建多个服务实例,我想避免这种情况。 有人可以看看我的代码并发现我需要做的改变。

使用被复制的主要服务的第二个服务。

export class SecondaryService {
    constructor(private primarySvc: IPrimaryService){
        this.primarySvc.someSubject.subscribe(() => {});
    }
}

主要服务(被复制的服务)

export class PrimaryService {
    someSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
    constructor(){}
}

主要服务提供者

@Injectable()
export class PrimaryServiceProvider extends PrimaryService {
     constructor(){
          super();
     }
}

二级服务提供商

@Injectable()
export class SecondaryServiceProvider extends SecondaryService {
    constructor(private PrimaryProvider: PrimaryServiceProvider){
        super(PrimaryProvider);
    }
}

app.module.ts

 @NgModule({
     declaration: [SecondaryComponent],
     exports: [SecondaryComponent],
     imports: [BrowserModule],
     providers: [SecondaryServiceProvider, PrimaryServiceProvider ]
 })
 export class SearchModule{}

现在我正在尝试使用我在本地环境中制作的组件,它看起来像这样:

app.module.ts

 @NgModule({
     declaration: [AppComponent, HomeComponent],
     imports: [SearchModule, BrowserModule],
     providers: [PrimaryServiceProvider, SecondaryServiceProvider],
     bootstrap: [AppComponent]
 })
 export class AppModule{}

home.component.ts

export class HomeComponent {
    constructor( primarySvc: PrimaryServiceProvider, 
        secondarySvc: SecondaryServiceProvider) {
        this.primarySvc.someSubject.next(false);
    }
}

现在我确定主服务有两个实例,因为someSubject不同步,并且 SecondarySvc 中的订阅没有从 home.component.ts 获取任何值

请告诉我我需要在哪里进行更改

谢谢!!

回答我自己的问题:

由于导入时文件路径不正确,服务被重复。 Windows 允许您使用不区分大小写的文件路径,这可能会在每次使用模块时创建多个实例。

我认为您使用PrimaryServiceProviderSecondaryServiceProvider服务进行了过度设计。

要创建 singleton 服务,只需在Injectable装饰器中设置providedIn: 'root'选项,如下所示:

@Injectable({ providedIn: 'root' })
export class SecondaryService {}

最后,确保不要在任何providers数组中注册 singleton 服务。

在此处查看有关此的官方文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM