2017-02-11 73 views
-1

我讀了匕首2的文檔,但仍然無法找到在我的應用程序中應該使用dagger2的條件以及它的實現有哪些好處?在任何android應用程序中使用Dagger2的具體要求是什麼?在android應用程序中使用dagger2的實際好處是什麼?

+0

這是一個依賴注入框架。所以當你需要使用依賴注入時它很有用。無論何時您需要調用屬於另一個類的代碼中的方法。這幾乎總是?我喜歡這篇文章https://spring.io/blog/2011/08/26/clean-code-in-android-applications只是用匕首取代Guice – EpicPandaForce

+1

可能重複[除了測試,爲什麼我們需要Dagger 2?] (http://stackoverflow.com/questions/41895802/beside-testing-why-do-we-need-dagger-2) –

回答

0

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

相關問題