• Data provider depends on database • Image Loader depends on HTTP • REST depends on HTTP • REST depends on deserializer • Login screen depends on all the above
Dependency inversion principle • High-level modules should not depend on low-level modules. Both should depend on abstractions. • Abstractions should not depend on details. Details should depend on abstractions.
Multiple Modules • Compile time @Module(includes = HttpModule.class) public final class RestModule { } • Runtime ObjectGraph.create(new RestModule(), new HttpModule()); Warning!
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
// HttpModule.java @Module(library = true) public final class HttpModule { @Provides OkHttp provideOkHttp() { return new OkHttp(); } } // RestModule.java @Module(complete = false) public final class RestModule { @Provides Retrofit provideRetrofit(OkHttp okHttp) { return new Retrofit(okHttp); } }
Module Overrides @Module() public final class MyModule { @Provides Writer provideWriter() { return new PrinterWriter(); } } @Module( includes = MyModule.class, overrides = true ) public final class TestModule { @Provides Writer provideWriter() { return new TestWriter(); } }
Module Overrides @Module() public final class MyModule { @Provides Writer provideWriter() { return new PrinterWriter(); } } @Module( includes = MyModule.class, overrides = true ) public final class TestModule { @Provides Writer provideWriter() { return new TestWriter(); } }
Module Overrides @Module() public final class MyModule { @Provides Writer provideWriter() { return new PrinterWriter(); } } @Module( includes = MyModule.class, overrides = true ) public final class TestModule { @Provides Writer provideWriter() { return new TestWriter(); } }
Module Overrides @Module() public final class MyModule { @Provides Writer provideWriter() { return new PrinterWriter(); } } @Module( includes = MyModule.class, overrides = true ) public final class TestModule { @Provides Writer provideWriter() { return new TestWriter(); } }
Module Overrides @Module() public final class MyModule { @Provides Writer provideWriter() { return new PrinterWriter(); } } @Module( includes = MyModule.class, overrides = true ) public final class TestModule { @Provides Writer provideWriter() { return new TestWriter(); } }
Module Overrides @Module() public final class MyModule { @Provides Writer provideWriter() { return new PrinterWriter(); } } @Module( includes = MyModule.class, overrides = true ) public final class TestModule { @Provides Writer provideWriter() { return new TestWriter(); } }