2017-01-26 1 views
0

Lassen Sie uns sagen, dass ich die folgenden Klassen:Resolve-Abhängigkeit mit dem Parameter

class A 
{ 
    // reference to B 
    private B _b; 

    // constructor for A 
    public A(B b) 
    { 
     _b = b; 
    } 
} 

class B 
{ 
    private A _a; 

    // constructor for B 
    public B() 
    { 
     // initialize A and give it a reference on self 
     a = new A(this); 
    } 
} 

Wie ersetze ich die manuelle Initialisierung von A, mit Dependency Injection, A Geräte unter Berücksichtigung entsprechender Schnittstelle IA, und ich habe die entsprechende Bindung in meinem ninject Konfiguration:

.Bind<IA>().To<A>().InTransientScope(); 

Alle Abhilfe willkommen :) ist
PS Es ist eine WPF-Anwendung.

+0

Bind IB IA automatisch A. nach B Refactoring vor Bindung sollte es beheben - Es hängt davon ab, was IOC Sie verwenden. –

+0

Und Edit-Konstruktor von A, zu öffentlichen A (IB b) statt B –

+3

Sie sollten die zyklische Abhängigkeit durch Extrahieren geteilter Logik aus B oder A in eine neue Klasse C brechen. Sie injizieren C in beide A und B. – Steven

Antwort

2

Sie benötigen würde Ihr Code

class A { 
    private B _b; 
    public A(B b) { 
    _b = b; 
    } 
} 
class B { 
    private A _a; 
    public B(A a) { 
    _a = a; 
    } 
} 

jedoch Refactoring, schafft dies einen zirkulären Verweis und Ihren Container wird wahrscheinlich eine Ausnahme für diese werfen.

um dieses Problem Sie Ihren Code Siehe

class A { 
    private C _c; 
    public A(C c) { 
    _c = c; 
    } 
} 
class B { 
    private A _a; 
    private C _c; 
    public B(A a, C c) { 
    _a = a; 
    _c = c; 
    } 
} 
class C { 
    public C() { 
    } 
} 

Refactoring arbeiten müssen Circular Dependency in constructors and Dependency Injection, wie Sie Ihre Klassen C

Verwandte Themen