2
votes

Dépendance circulaire d'environnement angulaire

Comme décrit dans la documentation, j'utilise plusieurs fichiers environment pour paramétrer le démarrage de l'application.

environment.prod.ts :

@NgModule({
    declarations: [],
    imports: [
        LoggerModule.forRoot({ level: NgxLoggerLevel.ERROR })
    ],
    providers: [
        ...
        { provide: API_BASE_URL, useValue: environment.baseUrl }
    ]
})
export class ProductionModule {}

environment.ts :

export const environment = {
    production: false,
    module: DevelopmentModule
}

À l'intérieur de ProductionModule Je voudrais "obtenir "une URL d'API distante du module environnement .

export const environment = {
    production: true,
    module: ProductionModule,
    baseUrl: ...
}

Cependant, cela produit une erreur Circular dependency .
Quelle est la bonne façon de résoudre ce problème?


4 commentaires

Pourquoi avez-vous des moduje dans le fichier d'environnement?


@Antoniossss que voulez-vous dire?


Quel module avez-vous importé l'environnement?


@VinodBhavnani J'ai utilisé environnement uniquement à l'intérieur de ProductionModule


3 Réponses :


2
votes

Vous n'avez pas besoin d'utiliser des fournisseurs ni des modules pour obtenir quoi que ce soit de environnement .

Il suffit d'importer simplement environment.baseUrl où vous en avez réellement besoin dans le code.

import { environment } from '../../environments/environment';

et dans le code uniquement

environment.baseUrl

Cela vous évitera une dépendance circulaire (je veux dire dans votre cas - pas en général), et voir TOUT MODULE dans le fichier d'environnement est une odeur de code pour moi.


9 commentaires

Est-ce la manière la plus correcte? Je veux dire, j'aimerais éviter d'avoir un environnement partout. Une dépendance injectée sonne mieux


C'est la façon dont il est censé être utilisé, mais comment vous le faites dépend de vous.


Qu'en est-il de la création d'un autre module, dites ApiModule , et fournissez la dépendance ici? Je n'aurais qu'à inclure ApiModule dans les importations ProductionModule .


Le problème est que vous dans AnyModule vous importez un environnement qui importe AnyModule - c'est circulaire dep. Cassez-le en quelque sorte.


C'est la meilleure façon de le faire


Antonios, j'utilise beaucoup plus de modules importés dans le DevelopmentModule , c'est pourquoi je le paramètre. Y a-t-il un autre moyen?


Je paramétrerais le module basé sur env (si nécessaire) et ne les changerais pas directement dans le fichier env. Les basculer au niveau de configuration basé sur env pourrait fonctionner, mais je ne l'ai jamais fait aussi idk.


@Antoniossss Merci encore


@Antoniossss pourriez-vous peut-être poster un exemple de la façon dont vous paramétrez les modules importés?



0
votes

À partir de votre code, voici ce qui se passe ( => signifie dépend de):

environment.ts/environment.prod.ts =>
DevelopmentModule/ProductionModule =>
environment.ts/environment.prod.ts (because, in providers array, you are using environments

Donc, comme vous pouvez le voir ci-dessus, comment cela génère une dépendance circulaire .

La bonne manière dépend de vous, de la manière dont vous voulez y parvenir.

Une solution pourrait être de supprimer l'entrée module des environnements , si vous ne l'utilisez nulle part.


0 commentaires

0
votes

Utilisez un service ApiProvider dans cet environnement d'importation de service. créez les fonctions dont vous avez besoin dans votre projet liées aux API backend. et utilisez ce service ApiProvider n'importe où dans votre projet.


0 commentaires