0

Le programme actuel entraîne une exception stackoverflow dont je sais pourquoi. Comment pourrais-je éviter la dépendance circulaire ici. Comment puis-je rendre les trois classes indépendantes l'une de l'autre bien que les classes soient dépendantes les unes des autres (imaginez simplement que les méthodes à l'intérieur de ces classes se réfèrent mutuellement).Comment éviter la dépendance circulaire dans ce scénario?

namespace CircularDependency_1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new A(); 
      B b = new B(); 
      Console.WriteLine("executed"); 
      Console.ReadLine(); 
     } 
    } 

    public class B 
    { 
     public A a; 

     public B() 
     { 
      a = new A(); 
      Console.WriteLine("Creating B"); 
     } 
    } 

    public class A 
    { 
     public B b; 

     public A() 
     {  
      b = new B(); 
      Console.WriteLine("Creating A"); 
     } 
    } 

    public class C 
    { 
     public A a; 
     public B b; 

     public C() 
     { 
      a = new A(); 
      b = new B(); 
      Console.WriteLine("Creating C"); 
     } 
    } 

} 
+1

pourquoi 'new'-ing' A' et ' B' dans le constructeur de l'autre? Quelles sont les raisons derrière cela? Qu'est-ce qu'on s'attend à faire? Vous voulez juste 1 A et 1B instance et ils se réfèrent les uns aux autres? Sans ces informations, votre question est simplement: J'ai une classe 'class A {A() {new A(); }} 'et comment devrais-je le réparer? Pas de réponse significative –

Répondre

0

Ce n'est pas une injection de dépendance, vous le créez dans le constructeur. Vous devez garder les A et les constructeurs B vide, et faire quelque chose comme ça dans C:

public class C 
    { 
     public A a; 
     public B b; 

     public C() 
     { 
      a = new A(); 
      b = new B(); 
      a.setB(b); 
      b.setA(a); 
     } 
    } 

En revanche, vous devriez vérifier si vous avez vraiment besoin d'avoir cette double référence.

EDIT: Je vois que vous n'êtes pas vraiment utiliser la classe C. Si vous voulez le faire dans le principal, est la même chose:

static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = new B(); 
     a.setB(b); 
     b.setA(a); 
    } 
+0

encore l'exception stackoverflow sera là –

+0

mmm, non, pourquoi? – leoxs

1

Vous ne devriez pas new'ing vos objets. Au lieu de cela, vous devez les passer en arguments au constructeur. Vous devez factoriser votre code:

public class A { 
    B _b; 
    public A(B b) { 
    _b = b; 
    Console.WriteLine("Creating A"); 
    } 
} 
public class B { 
    A _a; 
    public B(A a) { 
    _a = a; 
    Console.WriteLine("Creating B"); 
    } 
} 
public class C { 
    A _a; 
    B _b; 
    public C (A a, B b) { 
    _a = a; 
    _b = b; 
    Console.WriteLine("Creating C"); 
    } 
} 

Ensuite, vous devez factoriser les fonctions de A (ou B) dans une autre classe D:

public class A { 
    D _d; 
    public A(D d) { 
    _d = d; 
    Console.WriteLine("Creating A"); 
    } 
} 
public class B { 
    A _a; 
    D _d; 
    public B(A a, D d) { 
    _a = a; 
    _d = d; 
    Console.WriteLine("Creating B"); 
    } 
} 

public class C { 
    A _a; 
    B _b; 
    public C (A a, B b) { 
    _a = a; 
    _b = b; 
    Console.WriteLine("Creating C"); 
    } 
} 

public class D { 
    public D() { 
    Console.WriteLine("Creating D"); 
    } 
} 

Vous pouvez alors créer des objets comme

D d = new D(); 
A a = new A(d); 
B b = new B(a, d); 
C c = new C(a, b); 
Console.WriteLine("executed"); 
Console.ReadLine(); 

Voir Circular Dependency in constructors and Dependency Injection sur comment refactoriser vos classes pour supprimer les références circulaires