2013-04-06 4 views
5

В Guice я имел полный контроль над тем, когда были созданы модули, и использовал некоторые модули с аргументами конструктора, которые я установил.Модули кинжалов с аргументами конструктора?

В кинжале, однако, метод ссылки на другие модули через @Module включает аннотацию и не предоставляет мне тот же метод создания модулей для установки.

Возможно ли создать разумный ObjectGraph из нескольких модулей, имеющих аргументы конструктора? Особенно тот, который будет работать с кинжалом-компилятором и не запускаться в циклический граф?

ответ

3

Если у вас несколько модулей с использованием одного и того же объекта, возможно, вам следует разделить этот объект на свой собственный модуль. Например, много модулей использовать контекст приложения, так что я имею следующий модуль:

@Module 
public class ContextModule { 

    private final Context mContext; 

    public ContextModule(Context context) { 
     mContext = context; 
    } 

    @Provides 
    public Context provideContext() { 
     return mContext; 
    } 

} 

Так что теперь в других модулях, когда при мне нужен объект контекста я просто включить модуль.

Например:

@Module(entryPoints = { MyFragment.class }, includes = { ContextModule.class }) 
public class ServicesModule { 

    @Provides 
    public LocationManager provideLocationManager(Context context) { 

     return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    @Provides 
    public Geocoder provideGeocoder(Context context) { 
     return new Geocoder(context); 
    } 
} 

Затем, когда я построить граф объектов я в конечном итоге только с одним модулем, который принимает контекст приложения в качестве аргумента.

+3

Так что это похоже на то, что я уже сделал, и я могу предоставить конструктор для каждого модуля, который я передаю ObjectGraph.create() ... однако я заметил, что это ломается, если я пытаюсь для расширения ObjectGraph с использованием .plus() ... в этот момент граф, кажется, теряет знание ранее построенных модулей и взрывов с исключением, когда пытается создайте включенный модуль. – thebamaman

3

ObjectGraph.create() принимает список переменных модулей (списков параметров), так что вы можете сделать это:

ObjectGraph objectGraph = ObjectGraph.create(new ProductionModule(context), new OverridingTestModule()); 

Взгляните на InjectionTest.java Dagger (см тест "moduleOverrides" там): https://github.com/square/dagger/blob/master/core/src/test/java/dagger/InjectionTest.java

+0

Это правильно. Обратите внимание, что вы также должны установить переопределения = True в основном тестовом модуле. –

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