2016-11-26 10 views
0

Например, скажем, как показано ниже.Как я могу вставить другой экземпляр с помощью Dagger2

  • есть деятельность под названием MyActivity.
  • Есть два класса с именем A, B и MyActivity, которые имеют эти экземпляры классов.
  • есть класс с именем C, который я хочу ввести в A & B.
  • C имеет область действия, которая следует за жизненным циклом деятельности.

В этой ситуации, независимо от области действия, есть ли способ передать другой экземпляр C в A, B с помощью кинжала 2?

+1

http://stackoverflow.com/a/40447384/7045114 –

+0

Возможный дубликат [Как обеспечить объекты тот же тип? Dagger2] (http://stackoverflow.com/questions/40447262/how-to-provide-objects-of-the-same-type-dagger2) –

ответ

2

Вам необходимо использовать qualifiers. Из раздела классификаторов dagger user's guide:

Иногда одного типа недостаточно для идентификации зависимости. В в этом случае мы добавляем аннотацию классификатора.

В вашем случае, просто C не достаточно, чтобы определить два различных зависимостей, которые вы хотите инжектированных в A и B. Таким образом, вы бы добавили квалификатор, чтобы отличить два экземпляра. Вот пример:

public class A { 

    private final C c; 

    @Inject 
    public A(@Named("Instance 1") C c) { 
     this.c = c; 
    } 
} 

public class B { 
    private final C c; 

    @Inject 
    public B(@Named("Instance 2") C c) { 
     this.c = c; 
    } 
} 

Модуль:

@Module 
public class CModule() { 

    @Provides 
    @Named("Instance 1") 
    C provideInstance1OfC() { 
     return new C(); 
    } 

    @Provides 
    @Named("Instance 2") 
    C provideInstance2OfC() { 
     return new C(); 
    } 
} 

Компонент:

@Component(modules = { CModule.class }) 
public interface ActivityComponent { 
    void inject(MyActivitiy activity); 
} 

Тогда, наконец:

public class MyActivity extends Activity { 
    @Inject A a; 
    @Inject B b; 

    @Override 
    void onCreate() { 
     super.onCreate(); 
     DaggerActivityComponent.builder() 
      .cModule(new CModule()) 
      .build() 
      .inject(this); 
    } 
} 
+0

да, почему я так никогда и не думал об этом? вы святой. Благодарю. –