-2

I read the dagger 2 documentation but still not able to find that in what condition I should use dagger2 in my application and what are the benefits of its implementation?

R. Zagórski
  • 18,351
  • 5
  • 59
  • 86
  • It's a dependency injection framework. So it's useful whenever you need to use dependency injection. Which is whenever you need to call a method in your code that belongs to another class. Which is pretty much always? I like this article https://spring.io/blog/2011/08/26/clean-code-in-android-applications just replace Guice with Dagger – EpicPandaForce Feb 11 '17 at 18:40
  • 1
    Possible duplicate of [Beside testing, why do we need Dagger 2?](http://stackoverflow.com/questions/41895802/beside-testing-why-do-we-need-dagger-2) – David Rawson Feb 11 '17 at 22:27

1 Answers1

0

1.) to use Dagger2, you need to include it as a dependency in your project.

annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
compile 'com.google.dagger:dagger:2.9'
provided 'org.glassfish:javax.annotation:10.0-b28'

Then you can use Dagger2.


2.) Whenever you have a class which is the dependency of another class.

So if you have something like this:

public int getNewRandomNumber() {
    return new Random().nextInt(5000);
}

Then you have an implicit dependency on Random and it is not mockable.

So you might want to provide this as a dependency to the method instead:

public int getNewRandomNumber(Random random) {
   return random.nextInt(5000);
}

But you might be using Random in a bunch of places, so you might want to provide it to the class itself:

public class RandomGenerator {
    private final Random random;

    public RandomGenerator(Random random) {
        this.random = random;
    }
}

After which the question surfaces: if you need an instance of RandomGenerator, where are you getting Random from?

Surely this is stupid:

RandomGenerator gen = new RandomGenerator(new Random());

Wouldn't it be nicer to do either this:

RandomGenerator randomGenerator = component.randomGenerator();

or

@Inject
RandomGenerator randomGenerator;

Well apparently with Dagger it's pretty easy

@Module
public class RandomModule {
    @Provides
    @Singleton
    Random random() {
        return new Random();
    }
}

@Singleton
@Component(modules={RandomModule.class})
public interface SingletonComponent {
    Random random();
    RandomGenerator randomGenerator();
}

then

@Singleton
public class RandomGenerator {
    private final Random random;

    @Inject
    public RandomGenerator(Random random) {
        this.random = random;
    }
}

or

@Singleton
public class RandomGenerator {
    @Inject
    Random random;

    @Inject
    public RandomGenerator() {
    }
}

You can read more about dependency injection here

Community
  • 1
  • 1
EpicPandaForce
  • 71,034
  • 25
  • 221
  • 371