3
votes

Angular 7 - build --prod a échoué avec une erreur: impossible de résoudre tous les paramètres pour

J'utilise Angular: 7.2.10 et quand j'essaye de construire un projet pour la production avec la commande:

export function apiHost(store: Store<RemoteConfig>, http: HttpClient, httpUtils: HttpUtilsService) {
  let item: string = localStorage.getItem(environment.apiHost);

  //store.pipe(select(backendApiHost), take(1)).subscribe(api => item = api); // Todo not always read val!
  //console.log('ss: ' + item);
  return new ApiService(item, http, httpUtils);
}

J'ai une erreur

{      
      provide: ApiService,
      useFactory: apiHost,
      deps: [Store, HttpClient, HttpUtilsService]
    }

J'ai un service avec un constructeur avec 3 paramètres:

constructor(api: string, private _http: HttpClient, private httpUtils: HttpUtilsService) {
    this.api = `${api}/api`;        
  }

Qui instancie par l'usine définie à app.module.ts:

ERROR in : Can't resolve all parameters for ApiService in ...

apiHost

ng b --prod

Lorsque j'utilise ng build , cela fonctionne correctement.


0 commentaires

3 Réponses :


0
votes

Angular ne trouve pas de fournisseur pour api: string . En fait, vous n'injectez pas ApiService, vous le créez dans le code ici: return new ApiService (item, http, httpUtils) , donc vous n'avez pas besoin de le définir dans les fournisseurs.


0 commentaires

0
votes

Je vous suggère de supprimer la variable api du constructeur, de la transmettre aux méthodes de classe, d'utiliser le constructeur uniquement pour passer l'injection.

getApi(api: string) {
    this._http.get(api).toPromise()
}

puis étend votre service api et passez l'URI dans le paramètre, je vous suggère de laisser _http public aussi, l'hôte de l'API ne peut pas voir le http privé et ces saisies peuvent échouer une production de construction


0 commentaires

3
votes

Les dépendances sont résolues implicitement en examinant les métadonnées émises par le compilateur. Ces métadonnées sont dérivées des types de paramètres.

Au moment de l'exécution, l'injecteur angulaire inspecte ces informations pour déterminer les dépendances à injecter. Plus précisément, il recherche un fournisseur enregistré pour chaque paramètre correspondant.

Puisque vous n'avez pas enregistré de fournisseur qui mappe aux métadonnées émises pour un paramètre de type string , la recherche échoue et vous recevez une erreur. Vous pouvez enregistrer un fournisseur pour ce type, mais il ne serait pas judicieux de le faire étant donné l'ampleur de l'utilisation des chaînes.

Cependant, les fonctions d'injection de dépendances d'Angular ne sont pas limitées à cette résolution implicite. En combinant le décorateur Inject et les InjectionToken , vous pouvez obtenir ce que vous souhaitez.

api-token.ts

import {Inject, Injectable} from '@angular/core';

import {apiToken} from './api-token';

@Injectable({providedIn: 'root'})
export class DataService {
   constructor(@Inject(apiToken) api: string) {}
}

Vous pouvez maintenant utiliser ce jeton pour demander que cette dépendance soit résolue pour un paramètre spécifique.

data.service.ts strong>

import {InjectionToken} from '@angular/core';

export const apiToken = new InjectionToken('api', {
  providedIn: 'root',
  value: 'myapi'
});


0 commentaires