2017-02-11 2 views
-1

Я прочитал документацию по кинжалу 2, но все еще не могу найти, в каком состоянии я должен использовать dagger2 в своем приложении и каковы преимущества его реализации?Какое конкретное требование использовать Dagger2 в любом приложении Android? Каковы фактические преимущества использования dagger2 в приложении Android?

+0

Это основа внедрения зависимостей. Поэтому это полезно, когда вам нужно использовать инъекцию зависимостей. Это когда вам нужно вызвать метод в вашем коде, который принадлежит другому классу. Который в значительной степени всегда? Мне нравится эта статья https://spring.io/blog/2011/08/26/clean-code-in-android-applications просто заменить Guice Dagger – EpicPandaForce

+1

Возможный дубликат [Помимо тестирования, зачем нам нужен кинжал 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

Смежные вопросы