2016-02-24 46 views
0

只需在Android应用程序中试用Dagger 2,我觉得可能有更简单的解决方案来实现我的目标。对于Dagger 2,从其他模块访问1模块内的实例的最佳方式是什么?

我有2个模块:

  • ApplicationModule其中顾名思义其生命周期是依赖于整个应用程序。

  • UserModule每当用户登录被创建。

现在说我有一个是在ApplicationModule创造了单Prefs实例,但我需要访问它的类UserModule内,什么是最好的方式去做这件事?目前我正在ApplicationModule中创建它,然后在创建时将它传递给UserModule的构造函数。有没有办法避免这样做,让匕首为我管理这件事?

@Module 
public class ApplicationModule { 
    @Provides 
    @Singleton 
    public Prefs prefs() { 
     return new Prefs(); 
    } 
} 

@Singleton 
@Component(modules={ApplicationModule.class}) 
public interface ApplicationComponent { 
    Prefs providePrefs(); 
} 

@Module 
public class UserModule { 
    private Prefs prefs; 

    public UserModule(Prefs prefs) { 
     // Anyway to avoid having to do this? 
     this.prefs = prefs; 
    } 

    @Provides 
    @UserScope 
    public UserService userService() { 
     // Possible to get the prefs from the ApplicationComponent? 
     return new UserService(this.prefs); 
    } 
} 

@Component(dependencies = {ApplicationComponent.class}, modules = {UserModule.class}) 
@UserScope 
public interface UserComponent extends ApplicationComponent { 
    UserService provideUserService(); 
} 

回答

2

匕首的整点是让它为你解决依赖关系。您不需要将任何内容传入模块,这不是直接需要的,就像用户模块的实际用户一样。

依赖将由匕首解决。你的情况,这意味着适合你这样的代码:

@Module 
public class UserModule { 

    public UserModule() { 
     // way of avoiding this code ;) 
    } 

    @Provides 
    @UserScope 
    public UserService userService(Prefs prefs) { 
     return new UserService(prefs); 
    } 
} 

这样匕首将提供相关性的方法。你不必亲自去做。

这个工作的先决条件是实际上可以提供依赖关系。在你的情况下,Prefs由应用程序组件提供。只要您实例化一个@Subcomponent或您的案例依赖@Component与暴露的依赖项,它将在您的应用程序组件中工作— Prefs providePrefs()方法。

如果提供依赖项的模块位于同一个组件中,这也可以工作。


如果您UserService取决于没有别的,你甚至可以考虑删除整个模块,因为它看起来像它可以通过构造函数注入来提供。

@UserScope 
public class UserService { 

    Prefs prefs; 

    @Inject 
    public UserService(Prefs prefs) { 
     this.prefs = prefs; 
    } 
} 
+0

谢谢你的回应大卫,这些例子很有帮助。我确实有一个困惑,如果我像在示例中那样删除UserModule构造函数中的参数,UserService是否会在创建UserModule之前创建?既然UserService现在已经实现了它的依赖关系,如果是这样的话,甚至可以将UserService放在UserModule内强制执行任何操作? – Mike

+0

@Mike你需要一个UserModule来创建你的组件,所以它会在之前创建。这应该不会有影响。模块只是提供依赖关系,如果他们不能由匕首本身创建 –

+0

明白了,谢谢你的解释! – Mike

相关问题