Injecting services in custom ErrorHandler causes "Cannot instantiate cyclic dependency!" error, how can I fix this? Injecting services in custom ErrorHandler causes "Cannot instantiate cyclic dependency!" error, how can I fix this? angular angular

Injecting services in custom ErrorHandler causes "Cannot instantiate cyclic dependency!" error, how can I fix this?


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 itself just doesn't support cyclic dependencies.


The ErrorHandler is created before the providers. So we need Injector for dependency injection in our custom error handler class.

@Injectable()export class MyErrorHandler implements ErrorHandler{   constructor(private injector: Injector) { }   handleError(error: any) {      let router = this.injector.get(ServiceName);    }}

Create a default service via Angular cli and check the first part see providedIn: 'root',

@Injectable({  providedIn: 'root',})export class CustomService{  constructor(private otherService: OtherService) { // ok not failed } }

For more detail check angular @Injectable-level configuration

@NgModule-level injectors You can configure a provider at the module level using the providers metadata option for a non-root NgModule, in order to limit the scope of the provider to that module. This is the equivalent of specifying the non-root module in the @Injectable() metadata, except that the service provided via providers is not tree-shakable.