Filipe
Filipe

Reputation: 273

Injecting dependencies into a class

I created a class that needs a service:

export class RepositoryManager {
     //...
     private http: ApplicationHttpClient;

     constructor() {
         const injector = Injector.create({providers: [{provide: ApplicationHttpClient, deps: []}]});
         this.http = injector.get(ApplicationHttpClient);
     }
     //...
}

However, the ApplicationHttpClient service requires that the HttpClient be passed to the constructor.

@Injectable()
export class ApplicationHttpClient {
    //...
    public constructor(public http: HttpClient) { }
    //...
}

I tried to pass the HttpClient as deps (RepositoryManager):

     constructor() {
         const injector = Injector.create({providers: [{provide: ApplicationHttpClient, deps: [HttpClient]}]});
         this.http = injector.get(ApplicationHttpClient);
     }

However, the following error occurred:

NullInjectorError: No provider for HttpClient!

[EDIT]

//...
imports: [
    HttpClientModule,
    //...
],
providers: [
{
  provide: ApplicationHttpClient,
  useFactory: ApplicationHttpClientCreator,
  deps: [HttpClient]
},
HttpClient,
//...
],

Upvotes: 2

Views: 390

Answers (1)

yurzui
yurzui

Reputation: 214017

Who downvoted this answer? Can you elaborate what's wrong here?

First of all, you should import HttpClientModule in your root AppModule.

After that you have two options to create your custom injector:

constructor(parentInjector: Injector) {
  const injector = Injector.create({
    providers: [{ provide: ApplicationHttpClient, deps: [HttpClient] }],
    parent: parentInjector
  });
  ...
}

or

constructor(parentInjector: Injector) {
  const injector = Injector.create(
    [{ provide: ApplicationHttpClient, deps: [HttpClient] }],
    parentInjector
  );
  ...
}

Now DI system should be able to get HttpClient instance through passed parent injector.

Tip: if you doubt which parameters method takes always look at method signature

Upvotes: 1

Related Questions