2015-08-29 24 views
1

我想通过在一个小例子中实现它来学习DI与Dagger 2。我得到了 @Module和@Component的概念。 @Component将@Module绑定到需要注入依赖项的类。空构造函数模块和提供依赖于Dagger 2中参数的模块有什么区别?

Dagger生成Dagger,它有一个Builder类,它提供并初始化 依赖项。

所以我试了一些场景,以更好地理解匕首2.我有一些问题,但我会去 与一个现在。

我需要注入DatabaseHelper类。我为此创建了DatabaseModule类。我也发现 我可以跳过这个类,并在我的主要ApplicationModule中添加一个方法来提供DatabaseHelper。要做 我不能将DatabaseModule添加到ApplicationComponent模块列表中。无论如何,我已将DatabaseModule 保存在ApplicationComponent模块列表中,并从ApplicationModule中删除该方法。回到我的问题。

我有两个选择,当涉及到创建DatabaseModule类。这是第一个。

@Module 
public class DatabaseModule { 

    private Application app; 

    public DatabaseModule(Application app) { 
     this.app = app; 
    } 

    @Singleton 
    @Provides 
    public DatabaseHelper provideDBHelper() { 
     return new DatabaseHelper(app.getApplicationContext()); 
    } 
} 

而第二个选项是,

@Module 
public class DatabaseModule { 

    @Singleton 
    @Provides 
    public DatabaseHelper provideDBHelper(Application app) { 
     return new DatabaseHelper(app.getApplicationContext()); 
    } 
} 

如果我使用第二种方法,我不需要调用组件生成器的方法.databaseModule()如匕首 照顾它。我想这个数字非常微不足道。

我的问题是 - 这两者有什么区别?我应该使用哪一个?什么是专业 和每种方法的缺点。另外,如果我想在Application不是 的类中注入DatabaseHelper,我可以使用第一个选项吗? (因为它提供了一个单身人士)。

请指出,如果我做错了什么,需要改变的东西。这是我的 ApplicationModule和ApplicationComponent类。

@Module 
public class ApplicationModule { 
    private Application mApplication; 

    public ApplicationModule(Application app) { 
     mApplication = app; 
    } 

    @Singleton 
    @Provides 
    Application provideApplication() { 
     return mApplication; 
    } 
} 

ApplicationComponent类

@Singleton 
@Component(
     modules = { 
      ApplicationModule.class, 
      DatabaseModule.class 
     } 
) 
public interface ApplicationComponent { 
    Application getApplication(); 
    void inject(MyApplication app); 
    DatabaseHelper getDBHelper(); 
} 

回答

1

这听起来很奇怪,但是,这并不在其构造函数接收参数的@Module接收在其构造函数的参数和@Module之间的区别是,其中一个接收参数,另一个不接收参数。

是的,这是相当重复的,我知道。如果模块需要与它一起工作,则应该提供构造函数参数(例如,如果需要上下文,则可能需要将模块的应用程序/活动提供给它的给定范围)。如果它不需要外部参数,那么给它一个没有意义。

关键的区别在于必须明确给出具有外部参数的模块在施工中的Dagger___Component.builder()方法。如果所有模块都未参数化,则可以使用Dagger___Component.create()方法,该方法为您创建每个非参数化模块。

如果你想打一个ApplicationModule没有参数,那么你可能需要做这样的事情

public enum ApplicationHolder { 
    INSTANCE; 

    private CustomApplication customApplication; 

    void setApplication(CustomApplication customApplication) { 
     this.customApplication = customApplication; 
    } 

    public CustomApplication getApplication() { 
     return application; 
    } 
} 

public class CustomApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     ApplicationHolder.INSTANCE.setApplication(this); 
    } 
} 

@Module 
public class ApplicationModule { 
    @Provides 
    public CustomApplication customApplication() { 
     return ApplicationHolder.INSTANCE.getApplication(); 
    } 
} 
相关问题