2015-08-07 5 views
0

Я пытаюсь реализовать завод с Dagger2, но я не знаю, как это сделать?Как реализовать завод с Dagger2

В упрощенном примере:

public class Foo{ 

    public interface Factory{ 
     Foo createNew(); 
    } 

    private Bar bar; 

    public Foo(Bar bar){ 
     this.bar= bar; 
    } 
} 

я хотел бы установить метод, который обеспечивает Foo.Factory экземпляры

@Module 
public class TestModule{ 
    @Provides 
    Bar provideBar(){ 
     return new Bar(); 
    } 

    @Provides 
    Foo.Factory provideFooFactory(){ 
     // ?????? 
    } 
} 

Результат должен быть что-то вроде (получение экземпляра Bar от модуль, конечно):

new Foo.Factory(){ 
     @Override 
     public Foo createNew() { 
     return new Foo(new Bar()); 
     } 
}; 

Каков правильный подход для достижения этого?

+1

Зачем устанавливать интерфейс Factory, если вы можете использовать Провайдер в JSR330, с которым удобно кинжал. –

+0

В документации говорится, что не использовать Провайдера, кроме устаревших приложений, вместо этого следует использовать шаблон Factory, но не дает никакого примера о том, как на самом деле сделать это с помощью кинжала. – trampster

ответ

1

У меня есть рабочее решение. Дайте мне знать, если у вас есть лучший способ.

@Module 
public class TestModule{ 
    @Provides 
    Bar provideBar(){ 
     return new Bar(); 
    } 
    @Provides 
    Foo provideFoo(Bar bar){ 
     return new Foo(bar); 
    } 

    @Provides 
    Foo.Factory provideFooFactory(final Provider<Foo> fooProvider){ 
     return new Foo.Factory(){ 
        @Override 
        public Foo createNew() { 
         return fooProvider.get(); 
        } 
     }; 
    } 
} 
Смежные вопросы