2014-10-15 2 views
1

В моем приложении Dart я использую шаблон MVP и библиотеку Injection с угловым дротиком (угловой-ди).Заводская инъекция в библиотеке Углового Dart DI

В приведенном выше примере я не могу вводить MyView или MyPresenter, так как это круговая зависимость.

class MyView { 
    MyPresenter presenter; 
    MyView(this.presenter); 
} 
class MyPresenter { 
    MyView view; 
    MyPresenter(this.view); 
} 

Как я обычно делал это в Java с Guice было впрыскивать завод, как:

class MyView { 
    MyPresenter presenter; 
    MyView(this.presenter); 
} 
class MyPresenter { 
    Factory<MyView> factoryView; 
    MyView view; 
    MyPresenter(this.factoryView) { 
     view = factoryView(this); 
    } 
} 

Как сделать это с помощью углового-ди? Можно ли вводить завод без необходимости писать завод?

ответ

2

Угловое 2 Дарта

typedef MyView MyViewFactoryFn(MyPresenter p); 
provide(MyView, useValue: (MyPresenter p) => new MyView(p)); 

MyPresenter(MyViewFactoryFn vf) { 
    view = vf(this); 
} 

или

typedef MyView MyViewFactoryFn(MyPresenter p); 

MyView viewFactory(MyPresenter p) => new MyView(p) 
const Provider(MyView, useFactory: viewFactory); 

MyPresenter(MyViewFactoryFn vf) { 
    view = vf(this); 
} 

Смотри также

Угловое 1 Dart

Вы можете связать замыкание

typedef MyView MyViewFactoryFn(MyPresenter p); 
bind(MyView, toValue: (MyPresenter p) => new MyView(p)); 

конструктор должен выглядеть, как

MyPresenter(MyViewFactoryFn vf) { 
    view = vf(this); 
} 

Существует также toFactory:, но я думаю, что DI вызовет сам завод, но я думаю, toValue: с закрытием может работать (не пробовал, хотя).

+0

Есть ли способ использовать традиционный @Component (директивы = const [MyView]) ??? –

+0

Несомненно, но это не связано с DI, это просто, чтобы сделать директивы и компоненты доступными для просмотра в представлении. –

Смежные вопросы