Square Dagger:正确扩展图形

时间:2014-11-25 14:27:08

标签: android dependency-injection dagger

我们说我有三个Dagger模块:

@Module()
public class MainModule {

    private Application application;

    public MainModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application provideApplication() {
        return application;
    }

    @Provides
    Something provideSomething(Application application) {
        return new Something(application);
    }
}



@Module()
public class SubModule1 {

    private Activity activity;

    public SubModule1(Activity activity) {
        this.activity = activity;
    }

    @Provides
    @Singleton
    Activity provideActivity() {
        return activity;
    }

    @Provides
    SomethingElse provideSomethingElse(Activity activity) {
        return new SomethingElse(activity);
    }
}

@Module()
public class SubModule2 {

    private Activity activity;

    public SubModule2(Activity activity) {
        this.activity = activity;
    }

    @Provides
    @Singleton
    Activity provideActivity() {
        return activity;
    }

    @Provides
    Anything provideAnything(Activity activity) {
        return new Anything(activity);
    }
}

现在假设我想做这样的事情:

public class MyApplication extends Application {
    ...
    @Override
    public void onCreate() {
        super.onCreate();

        objectGraph = ObjectGraph.create(new MainModule(this));
        objectGraph.inject(this);
    }
}


public class MyActivity1 extends Activity {
    ...
    @Override
    public void onCreate() {
        super.onCreate();

        objectGraph = ((MyApplication) getApplication()).getObjectGraph().plus(new SubModule1(this)
        objectGraph.inject(this);
    }
}


public class MyActivity2 extends Activity {
    ...
    @Override
    public void onCreate() {
        super.onCreate();

        objectGraph = ((MyApplication) getApplication()).getObjectGraph().plus(new SubModule2(this)
        objectGraph.inject(this);
    }
}

我也有可能发生这样的课程:

public class TestClass {
    @Inject
    SomethingElse somethingElse;
    @Inject
    Anything anything;
}

实施此方法的正确方法是什么?我应该如何使用包括 addsTo 注入完整加()

1 个答案:

答案 0 :(得分:0)

我通常按如下方式设置Dagger:

像这样扩展应用程序:

public class InjectingApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        objectGraph = ObjectGraph.create(new MainModule(this));
        objectGraph = ObjectGraph.create(new SubModule1(this));
        objectGraph = ObjectGraph.create(new ActivityModule());
        objectGraph.inject(this);
    }
}

然后有一个模块用于添加对您的活动的引用(在此实例中称为ActivityModule.java):

@Module(
     injects = {
        MyActivity1.class,
        MyActivity2.class }

) public class ActivityModule { }

然后您的活动将如下所示:

public class MyActivity1 extends Activity {

    @Inject
    Something something;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((InjectingApplication) getApplication()).inject(this);
    }

}

最后,您的模块将如下所示:

@Module()
public class MainModule {

    private Context context;

    public MainModule(Context context) {
        this.context = context;
    }


    @Provides
    Something provideSomething(Context context) {
        return new Something(context);
    }
}



@Module()
public class SubModule1 {

    private Context context;

    public SubModule1(Context context) {
        this.context = context;
    }

    @Provides
    SomethingElse provideSomethingElse(Context context) {
        return new SomethingElse(context);
    }
}