Angular技术问询:能否在Service类添加@NgModule装饰器管理依赖?
问题解答
首先明确:不能直接给Service类添加@NgModule装饰器。因为@NgModule是Angular专门用于定义模块类的装饰器,只能应用于模块类(比如AppModule这种类),无法直接作用于服务类。服务类需要用@Injectable装饰器标记为可注入的依赖。
要实现你的需求——每个服务依赖不同模块,且仅修改(1)(2)处就能切换服务,可以采用为每个服务创建独立的Feature Module的方式,具体步骤如下:
1. 为每个服务创建专属模块
分别为SqlConnectorService和NosqlConnectorService创建对应的模块,在模块中导入该服务所需的依赖模块,并配置服务提供者。
SqlConnectorModule
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; // 导入SqlConnectorService依赖的第三方/自定义模块,例如SqlClientModule import { SqlClientModule } from 'sql-client-library'; import { Connector } from './connector'; import { SqlConnectorService } from './sql-connector.service'; @NgModule({ imports: [ CommonModule, SqlClientModule // 这里导入Sql服务依赖的模块 ], providers: [ { provide: Connector, useClass: SqlConnectorService } ] }) export class SqlConnectorModule { }
NosqlConnectorModule
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; // 导入NosqlConnectorService依赖的模块,例如NosqlClientModule import { NosqlClientModule } from 'nosql-client-library'; import { Connector } from './connector'; import { NosqlConnectorService } from './nosql-connector.service'; @NgModule({ imports: [ CommonModule, NosqlClientModule // 这里导入Nosql服务依赖的模块 ], providers: [ { provide: Connector, useClass: NosqlConnectorService } ] }) export class NosqlConnectorModule { }
2. 修改AppModule实现快速切换
此时你只需要修改app.module.ts中的(1)和(2)处(或仅修改导入模块)即可切换服务:
import { Connector } from './class/connector'; import { SqlConnectorModule } from './class/sql-connector.module';//(1) 切换时替换为NosqlConnectorModule // import { NosqlConnectorModule } from './class/nosql-connector.module'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, AppRoutingModule, SqlConnectorModule //(1) 对应导入的服务模块,切换时替换 // NosqlConnectorModule ], // 可选:若模块中已配置providers,此处可删除该配置;若保留,切换时修改useClass即可 // providers: [{ provide: Connector, useClass: SqlConnectorService }],//(2) bootstrap: [AppComponent] }) export class AppModule { }
方案优势
- 每个服务的依赖模块被封装在各自的Feature Module中,不会污染
AppModule的导入列表 - 切换服务时仅需修改少量代码(导入语句和对应模块),完全符合你的需求
- 模块的封装性更好,便于后续维护和扩展
内容的提问来源于stack exchange,提问作者Murmulodi
相关产品推荐
相关产品推荐

