L’dependency injection peut-elle empêcher une dépendance circulaire?

Le projet n ° 1 comporte des interfaces et des classes faisant référence au projet n ° 2.

Maintenant, je veux utiliser la mise en œuvre du projet n ° 2 dans le projet n ° 1, mais vsnet se plaint d’une dépendance circulaire.

Si je devais utiliser l’dependency injection dans le projet n ° 1 et me lier à l’implémentation du projet n ° 2 (étant donné qu’il respecte le contrat d’interface), cela fonctionnera-t-il ou le message d’erreur de dépendance circulaire sera-t-il toujours affiché au moment de l’exécution?

Vous pourriez probablement résoudre ce problème avec DI, mais vous ne devriez pas .

Si je comprends bien, vous avez quelque chose comme ça:

   + Assemblée A + Assemblée B
   |  |
   + - Interface IFoo + - Classe ConcreteFoo: IFoo
   |  ^
   + - Classe MyClass -> -------> ------- |

En d’autres termes, vous essayez de faire référence à ConcreteFoo MyClass , mais vous ne pouvez pas, car l’assemblage B , dans lequel réside ConcreteFoo , dépend déjà de IFoo dans A

Ceci est une erreur de conception. Si vous déclarez l’interface IFoo dans Assembly A , mais pas d’implémentations concrètes, toutes les autres interfaces / classes de l’assembly A doivent uniquement faire référence à IFoo , jamais à une classe concrète qui l’implémente.

Il existe trois façons d’éliminer la dépendance circulaire:

  1. Rendre MyClass dépendant d’ IFoo au lieu de ConcreteFoo . C’est probablement la meilleure option si vous pouvez le faire. Si le problème est que vous avez besoin d’une instance physique d’ IFoo pour une utilisation dans MyClass et que vous ne savez pas où en obtenir une, IFoo prendre un IFoo dans le constructeur – laissez celui qui utilise MyClass déterminer quel IFoo utiliser.

  2. Déplacez les interfaces vers leur propre assemblage. C’est encore une pratique raisonnablement bonne. Votre conception ressemblera à ceci:

      + App assemblage + Interfaces d'assemblage + Béton d'assemblage
       |  |  |
       |  + - Interface IFoo |
       |  |  \ |
       + - Classe MyClass |  \ ------ + - Classe ConcreteFoo
       |  |  |  ^
       + ---- Member Foo -> ---------------------> ------------------- |
    
  3. Déplacez MyClass vers son propre assemblage. Effectivement, votre arbre de dépendance aura le même aspect que dans le point 2 ci-dessus, mais si l’assemblage A est beaucoup plus petit que B cela nécessitera moins d’effort.

J’espère que cela pourra aider.

Vous pouvez souvent résoudre les problèmes de dépendance circulaire avec l’dependency injection (DI) à l’aide d’une fabrique abstraite. Voir ici pour un exemple .

Cependant, bien que vous puissiez peut-être résoudre le problème avec DI, il serait préférable de repenser l’API pour supprimer la dépendance circulaire.

Vous pouvez souvent rompre une dépendance circulaire en modifiant l’une des extrémités d’une API basée sur une requête en une API basée sur un événement .

Tant que vous n’utilisez que des classes et des interfaces du projet 1 dans le code du projet 1, tout ira bien. (Je suppose que la configuration pour l’dependency injection est effectuée en dehors de la base de code de Project 1.)

Mais je dois aussi dire que la présence de toute dépendance circulaire devrait vous amener à vous demander pourquoi elle existe et à réfléchir à d’autres moyens de résoudre le problème qui l’élimine.