2017-05-31 5 views
2

Ich habe eine Komponente, die die aktuelle Aktivität und ihre Fragmente neu gruppiert, da der Bereich nur für diese Aktivität und nicht für die gesamte Anwendung bestimmt sein soll. Also in der OnCreate-Methode dieser Aktivität, ich erstelle meine Komponente und ich injiziere die aktuelle Aktivität (siehe Code unten).Verwenden Sie Dolch 2, ist es richtig, eine Aktivität in seine lokale Komponente zu injizieren?

Ich würde gerne wissen, ob das, was ich tue, richtig ist oder ob es einen besseren Weg gibt, das zu tun?

FYI, ich folge dem MVP-Design-Muster.

Komponente

@Singleton 
@Component(modules = { 
     FragmentX1Module.class, 
     FragmentX2Module.class, 
     ActivityXModule.class, 
     RepositoryModule.class, 
}) 
public interface ActivityXComponent { 
    void inject(FragmentX1Module fragment); 

    void inject(FragmentX2Module fragment); 

    void inject(ActivityXModule activity); 
} 

Aktivität

private ActivityXComponent mXComponent; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_x); 

    mXComponent = DaggerActivityXComponent.builder() 
      .activityXModule(new ActivityXModule(this)) // I need the Activity Context for later uses 
      .build(); 

    mXComponent.inject(this); 

    // ... 
} 

Antwort

2

Ich würde davon ausgehen, gibt es Objekte, die Sie in mehreren Aktivitäten injizieren wollen würde, vielleicht von Ihrem RepositoryModule. So würde ich vorschlagen, dass Sie eine App breite Komponente haben, wie:

@Singleton 
@Component(modules = { 
     RepositoryModule.class, 
}) 
public interface AppComponent { 
    ActivityXComponent plus(ActivityXModule module); 
} 

Dann sollten Sie Ihren Umfang ActivityXComponent als so etwas wie @PerActivity.

Werfen Sie einen Blick auf http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/ für ein gutes Beispiel.

+0

Aber muss ich dann noch ActivityX in die ActivityXComponent injizieren? – Eselfar

+0

@Eselar müssen Sie es im Konstruktor für 'ActivityXModule' bereitstellen. – gjsalot

Verwandte Themen