在自定义ErrorHandler中注入服务会导致“无法实例化循环依赖性!".错误,我该如何解决? [英] Injecting services in custom ErrorHandler causes "Cannot instantiate cyclic dependency!" error, how can I fix this?

查看:78
本文介绍了在自定义ErrorHandler中注入服务会导致“无法实例化循环依赖性!".错误,我该如何解决?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆