-1
我讀了匕首2的文檔,但仍然無法找到在我的應用程序中應該使用dagger2的條件以及它的實現有哪些好處?在任何android應用程序中使用Dagger2的具體要求是什麼?在android應用程序中使用dagger2的實際好處是什麼?
我讀了匕首2的文檔,但仍然無法找到在我的應用程序中應該使用dagger2的條件以及它的實現有哪些好處?在任何android應用程序中使用Dagger2的具體要求是什麼?在android應用程序中使用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.)每當你有一個類是另一個類的依賴。
所以,如果你有這樣的事情:
public int getNewRandomNumber() {
return new Random().nextInt(5000);
}
然後你有Random
一個隱含的依賴,這是不是mockable。
所以,你可能想提供這作爲一個依賴關係,而不是方法:
public int getNewRandomNumber(Random random) {
return random.nextInt(5000);
}
但你可能會在一堆的地方使用Random
,所以你可能想將其提供給類本身:
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;
那麼顯然與匕首它的很容易
@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
這是一個依賴注入框架。所以當你需要使用依賴注入時它很有用。無論何時您需要調用屬於另一個類的代碼中的方法。這幾乎總是?我喜歡這篇文章https://spring.io/blog/2011/08/26/clean-code-in-android-applications只是用匕首取代Guice – EpicPandaForce
可能重複[除了測試,爲什麼我們需要Dagger 2?] (http://stackoverflow.com/questions/41895802/beside-testing-why-do-we-need-dagger-2) –