在自定义ErrorHandler中注入服务会导致“无法实例化循环依赖性!".错误,我该如何解决? [英] Injecting services in custom ErrorHandler causes "Cannot instantiate cyclic dependency!" error, how can I fix this?
问题描述
我有以下代码:
app.module.ts:
app.module.ts:
NgModule({
declarations: [
AppComponent
],
imports: [
RouterModule,
BrowserModule,
ReactiveFormsModule,
FormsModule,
HttpModule,
AppRoutingModule // Routes
],
providers: [ // services
AppLog,
{provide: ErrorHandler, useClass: MyErrorHandler}
],
bootstrap: [AppComponent]
})
export class AppModule {}
MyErrorHandler.ts:
MyErrorHandler.ts:
@Injectable()
export class MyErrorHandler implements ErrorHandler {
constructor (private _appLog: AppLog) {}
handleError(error:any):void {
let errorMessage: string = "" + error
this._appLog.logMessageAsJson(errorMessage, "error")
.subscribe(
...
)
}
}
appLog.ts
appLog.ts
@Injectable()
export class AppLog {
constructor (private _http: Http) {}
logMessageAsJson(message: string, type: string) {
let headers = new Headers({ "Content-Type": "application/json" })
let jsonMessage = {"type": type, "message": message}
return this._http.post(JSON.stringify(jsonMessage), headers)
}
}
但是,当我的应用程序引导时,如果我在MyErrorHandler
中进行了注入并出现以下错误,它将失败:
However, when my app bootstrap, it fails if I have an injection in MyErrorHandler
with the following error :
Unhandled Promise rejection: Provider parse errors:
Cannot instantiate cyclic dependency!
如果我确实删除了constructor (private _appLog: AppLog) {}
,然后又在handleError
中执行了其他操作,则可以正常工作,并调用了ErrorHandler.
If I do remove constructor (private _appLog: AppLog) {}
and then do something else in handleError
it works just fine and the ErrorHandler is called.
我猜因为AppLog和MyErrorHandler同时实例化,所以它不起作用
I guess it doesn't work as AppLog and MyErrorHandler are instantiated at the same time
推荐答案
您可以使用此替代方法来解决DI的循环依赖性
You can use this workaround to break up cyclic dependencies with DI
@Injectable()
export class MyErrorHandler implements ErrorHandler {
private _appLog: AppLog;
constructor (injector:Injector) {
setTimeout(() => this._appLog = injector.get(AppLog));
}
...
}
Angulars DI本身只是不支持循环依赖关系.
Angulars DI itself just doesn't support cyclic dependencies.
这篇关于在自定义ErrorHandler中注入服务会导致“无法实例化循环依赖性!".错误,我该如何解决?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!