0

Das aktuelle Programm führt zu stackoverflow Ausnahme, die ich weiß warum. Wie könnte ich die zirkuläre Abhängigkeit hier vermeiden? Wie kann ich die drei Klassen unabhängig voneinander machen, obwohl die Klassen voneinander abhängig sind (stellen Sie sich einfach vor, dass die Methoden innerhalb dieser Klassen sich gegenseitig beziehen).Wie vermeidet man die zirkuläre Abhängigkeit in diesem Szenario?

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

warum 'new'-ing' A' und ' B' im Konstruktor des anderen? Was sind die Gründe dafür? Was soll es tun? Sie wollen nur 1 A und 1B Instanz und sie beziehen sich aufeinander? Ohne diese Informationen ist Ihre Frage einfach wie folgt: Ich habe eine Klasse 'Klasse A {A() {new A(); }} 'und wie soll ich es beheben? Keine sinnvolle Antwort –

Antwort

0

Das ist keine Abhängigkeitsinjektion, Sie erstellen es im Konstruktor. Sie sollten die A- und B-Konstrukteuren leer halten, und tun so etwas wie dies in C:

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

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

In der anderen Hand, sollten Sie überprüfen, ob Sie wirklich diese doppelte Referenz haben müssen.

EDIT: Ich sehe, dass Sie nicht wirklich Klasse C mit der Wenn Sie es in Haupt tun wollen, ist das Gleiche:

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

immer noch die stackoverflow Ausnahme wird dort sein –

+0

mmm, nein, warum? – leoxs

1

Sie sollten Ihre Objekte nicht sein new'ing auf. Stattdessen müssen Sie sie als Argumente an den Konstruktor übergeben. Sie müssen Ihren Code Refactoring:

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"); 
    } 
} 

Dann brauchen Sie Funktionen aus A Refactoring (oder B) in eine andere Klasse 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"); 
    } 
} 

Sie können dann Objekte erstellen, wie

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(); 

Siehe Circular Dependency in constructors and Dependency Injection zum Refactoring Ihrer Klassen zum Entfernen von Zirkelreferenzen

Verwandte Themen