2017-01-26 36 views
0

Допустит, у меня есть следующие классы:Resolve зависимость с параметром

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

Как заменить ручную инициализацию, с введением зависимостей, учитывая инвентарь соответствующего интерфейса IA, и у меня есть соответствующие привязки в моем Ninject конфигурация:

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

Любой обходной путь приветствуется :)
PS Это приложение WPF.

+0

Bind IB к B перед переплетом IA А. Он должен решить автоматически - Это зависит от того, что вы используете. –

+0

И Редактировать конструктор A, public A (IB b), а не B –

+3

Вы должны разбить циклическую зависимость, извлекая общую логику из B или A в новый класс C. Вы вводите C в A и B. – Steven

ответ

2

Вы должны были бы реорганизовать код

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

Однако, это создает циклическую ссылку и ваш контейнер, вероятно, бросить исключение для этого.

Чтобы обойти эту проблему вам нужно реорганизовать код

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

См Circular Dependency in constructors and Dependency Injection о том, как реорганизовать свои классы C