在任何 android 应用程序中使用 Dagger2 的具体要求是什么?在 android 应用程序中使用 dagger2 的实际好处是什么?

What is the specific requirement to use Dagger2 in any android application? What are the actual benefits of using dagger2 in an android application?

我阅读了 dagger 2 文档,但仍然无法找到在什么情况下我应该在我的应用程序中使用 dagger2 以及它的实现有什么好处?

1.) 要使用 Dagger2,您需要将其作为依赖项包含在您的项目中。

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

那你就可以用Dagger2了


2.) 每当你有一个 class 是另一个 class.

的依赖项

所以如果你有这样的事情:

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

那么你对 Random 有一个隐式依赖,它是不可模拟的。

因此您可能希望将此作为方法的依赖项提供:

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

但是您可能会在很多地方使用 Random,因此您可能希望将其提供给 class 本身:

public class RandomGenerator {
    private final Random random;

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

之后问题浮出水面:如果您需要 RandomGenerator 的实例,您从哪里获得 Random

这肯定是愚蠢的:

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

这样做不是更好吗:

RandomGenerator randomGenerator = component.randomGenerator();

@Inject
RandomGenerator randomGenerator;

显然,使用 Dagger 很容易

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

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

然后

@Singleton
public class RandomGenerator {
    private final Random random;

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

@Singleton
public class RandomGenerator {
    @Inject
    Random random;

    @Inject
    public RandomGenerator() {
    }
}

您可以阅读更多关于依赖注入的内容here