如何使 Angular 服务只能在特定模块内注入?

问题描述 投票:0回答:1

我正在尝试在 Angular 中创建一个服务,该服务只能在特定模块内注入,而不能在该模块外部访问。

我有一个服务

MyService
,我想限制它,因此它只能注入到
MyModule
中,而不能注入到应用程序的其他模块中。

我的服务(

my.service.ts
):

import { Injectable } from '@angular/core'; 
@Injectable({ 
    providedIn: 'root' // This allows the service to be available globally, which I want to avoid 
})

export class MyService { 
    constructor() {
    } 
}

我的模块(

my.module.ts
):

import { NgModule } from '@angular/core'; 
import { CommonModule } from '@angular/common';
import { MyService } from './my.service'; 
@NgModule({ 
    declarations: [], 
    imports: [CommonModule], 
    providers: [MyService] // Service should only be injectable here 
}) 
export class MyModule { }

我希望

MyService
只能在
MyModule
内注入,如果我尝试将其注入到其他模块中的组件或服务中,它不应该可用。

我试过:

  1. 在模块级别提供服务(

    providers: [MyService]
    中的
    MyModule
    )。

  2. 避免

    providedIn: 'root'
    来限制全局注入。

如何确保

MyService
只能在
MyModule
内注射?

angular dependency-injection angular-services angular-module
1个回答
0
投票

定义服务时删除

provideIn

@Injectable()
export class MyService { ..}

并添加模块的提供者

或者在模块中注入

@Injectable(
   provideIn:MyModule 
)
export class MyService { ..}

如果您使用独立组件,并且希望两个或更多组件共享同一个服务实例,请检查使用单例模式的SO

要检查服务是否确实只在模块中,您只需尝试在构造函数中将服务注入不属于模块的组件中。这会给您的应用程序带来错误。

要检查它是否是服务的同一实例,只需声明一个变量并在任何组件中更改它 - 在其他组件中,服务的变量将是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.