Angular5:如何将服务自定义方法作为模块的useFactory提供者
先贴出你当前的AuthModule配置方便参考:
import * as ... @NgModule({ providers: [ AuthentificationService, { provide: AuthHttp, useFactory: AuthentificationService.MYMETHOD, deps: [Http, RequestOptions, EnvVarsService, LocalStorageService, RouteNavigator, ReloadTokenEventService] } ] }) export class AuthModule { constructor( ) {} }
你想用AuthentificationService里的MYMETHOD作为useFactory但遇到问题,结合Angular 5的依赖注入规则,大概率是以下几个常见问题导致的,我给你逐一分析并给出解决方案:
1. MYMETHOD必须是静态方法
你直接通过AuthentificationService.MYMETHOD调用方法,这意味着这个方法必须是静态方法。如果它是实例方法,Angular会报错——因为此时AuthentificationService还没有被实例化,无法调用实例的方法。
正确的静态方法示例(假设你用的是angular2-jwt的AuthHttp):
export class AuthentificationService { // 关键:必须定义为静态方法 static MYMETHOD( http: Http, requestOptions: RequestOptions, envVarsService: EnvVarsService, localStorageService: LocalStorageService, routeNavigator: RouteNavigator, reloadTokenEventService: ReloadTokenEventService ): AuthHttp { // 在这里实现自定义的AuthHttp初始化逻辑 const customHeaders = new Headers(); // 示例:从LocalStorage获取token并设置Authorization头 const authToken = localStorageService.getAuthToken(); if (authToken) { customHeaders.append('Authorization', `Bearer ${authToken}`); } // 合并自定义头到请求选项 const authRequestOptions = requestOptions.merge({ headers: customHeaders }); // 返回AuthHttp实例(确保符合依赖注入的类型要求) return new AuthHttp(authRequestOptions, http); } }
2. 方法参数顺序必须与deps数组严格匹配
Angular的useFactory会按照deps数组的顺序,把对应的服务实例注入到工厂方法中。所以MYMETHOD的参数顺序必须和deps数组的顺序完全一致,否则会出现参数类型不匹配的错误。
比如你的deps顺序是:[Http, RequestOptions, EnvVarsService, LocalStorageService, RouteNavigator, ReloadTokenEventService],那MYMETHOD的参数必须严格按照这个顺序定义,不能调换位置。
3. 确保所有依赖服务已被正确提供
deps数组里的所有服务(比如EnvVarsService、LocalStorageService等),必须已经在当前AuthModule或者上级模块(比如AppModule)的providers中声明,或者是使用providedIn: 'root'标记的根服务。如果有服务未被正确提供,Angular会抛出“找不到提供者”的错误。
4. 确认工厂方法返回值类型正确
MYMETHOD必须返回AuthHttp类型的实例(或者其兼容的子类实例),这样Angular才能正确地把它作为AuthHttp的提供者注入到其他组件/服务中。如果返回值类型不匹配,会导致依赖注入失败。
内容的提问来源于stack exchange,提问作者firasKoubaa

