dependency; // Specifying a specific implementation in the constructor public ClientClass() { dependency = new DependencyClass(); } … } public class MyInjector { public static void main(String[] args) { ClientClass clientClass = new ClientClass(); … } }
dependency; // Specifying a specific implementation in the constructor public ClientClass() { dependency = new DependencyClass(new DependencyTwo()); } … } public class MyInjector { public static void main(String[] args) { ClientClass clientClass = new ClientClass(); … } }
CHANGE? • YOU WOULD HAVE TO REFACTOR CLIENT’S CODE TOO • WHAT IF YOU WANT HAVE A SINGLE INSTANCE OF DEPENDENCY IN ALL CLIENTS? • YOU WOULD HAVE TO CREATE FACTORY METHODS AND CLASSES
allowing a client to build or find the dependency, is the fundamental requirement of the pattern LONGER DEFINITION IN SOFTWARE ENGINEERING, DEPENDENCY INJECTION IS A SOFTWARE DESIGN PATTERN THAT IMPLEMENTS INVERSION OF CONTROL FOR RESOLVING DEPENDENCIES. DEPENDENCY : AN OBJECT THAT CAN BE USED INJECTION : AN INJECTION IS THE PASSING OF A DEPENDENCY TO A DEPENDENT OBJECT (A CLIENT) THAT WOULD USE IT.
• HURTS PERFORMANCE • ERRORS COULD BE KNOWN ONLY AT RUNTIME • PROGUARD CONFIGURATION ISSUES • GENERATED CODE HARD TO UNDERSTAND AND FOLLOW AS IT USED REFLECTION
CODE GENERATION AT COMPILE TIME - NO ISSUED WITH PERFORMANCE • ERRORS COULD BE KNOWN WHILE COMPILING • PROGUARD CONFIGURATION NOT REQUIRED • GENERATED CODE EASY TO UNDERSTAND
• APPLICATION WIDE SHARED INSTANCES • ACTIVITY WIDE SHARED INSTANCES (WHICH CAN BE SHARED BY FRAGMENTS AND PRESENTERS) • DO YOU WANT TO MOCK NETWORK ACCESS DURING TESTING? • WANT DIFFERENT IMPLEMENTATIONS FOR DIFFERENT BUILD FLAVOURS?
TO INJECT A DEPENDENCY public class DataStore { private final SharedPreferences sharedPreferences; @Inject public DataStore(SharedPreferences sharedPreferences) { } … CANNOT BE USED IN ANDROID ACTIVITIES, FRAGMENTS AND SERVICES
TO INJECT A DEPENDENCY public class DataStore { private SharedPreferences sharedPreferences; public DataStore() { } @Inject public foo(SharedPreferences sharedPref) { this.sharedPreferences = sharedPref; } …
@Module SIGNALS DAGGER TO SEARCH FOR INSTANCES IN THE METHODS @Module public class ApiModule { @Singleton @Provides public Converter.Factory getConvertorFactory() { return GsonConverterFactory.create(); } … }
ApiModule { @Singleton @Provides public Converter.Factory getConvertorFactory( return GsonConverterFactory.create(); } … } • PRESENT IN MODULES • ANNOTATES PROVIDER METHODS • PRESENT ALONG WITH SCOPE - SINGLETON OR CUSTOM SCOPE • METHOD NAME DOES NOT MATTER
TO HAVE ACCESS TO SINGLETONS WE DEFINED IN @MODULE. • DEFINES WHICH MODULE WILL BE USED • INDIVIDUAL ‘INJECT’ METHOD TO SHOW WHICH CLIENT CLASSES WOULD BE INJECTED @Component(modules = { ApiModule.class }) public interface AppComponent { void inject(MainActivity mainActivity); }