2017-01-26 1 views
0

Disons que j'ai les classes suivantes:Résoudre la dépendance avec le paramètre

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

Comment puis-je remplacer l'initialisation manuelle de A, avec l'injection de dépendance, en considérant une implémente l'interface IA, et je correspondant la liaison correspondante dans mon configuration ninject:

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

Toute solution de contournement est :) Bienvenue
PS C'est une application WPF.

+0

Bind IB à B avant la liaison IA A. Il devrait résoudre automatiquement - Cela dépend de ce que vous utilisez. –

+0

Et Edit constructeur de A, à public A (IB b) au lieu de B –

+3

Vous devez rompre la dépendance cyclique en extrayant la logique partagée hors de B ou A dans une nouvelle classe C. Vous injectez C dans A et B. – Steven

Répondre

2

Vous devrez refactoriser votre code pour

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

Cependant, cela crée une référence circulaire et votre conteneur sera probablement jeter une exception pour cela.

Pour contourner ce problème, vous devez factoriser votre code pour

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() { 
    } 
} 

Voir Circular Dependency in constructors and Dependency Injection sur la façon de factoriser vos classes C