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.