2017-04-07 94 views
3

可以说我有一个模块,我只想导出一个A的实例。然而,这个A要求在构造函数中传递BC的实例。因此,我们将宣布他们以及在模块中:匕首2:避免导出私有依赖关系

public class SampleModule { 

    @Provides 
    @Singleton 
    A provideA(B b, C c){ 
     return new A(b, c); 
    } 

    @Provides 
    @Singleton 
    B provideB(){ 
     return new B(); 
    } 

    @Provides 
    @Singleton 
    C provideC(){ 
     return new C(); 
    } 
} 

这工作,但现在BC也可在代码的其他地方。我想让他们保持私密,强制客户端只能访问A

有没有办法做到这一点?

+1

http://stackoverflow.com/questions/39219257/can-a-dagger-2-dependency-be-non-injectable –

+1

的可能的复制[匕首2依赖性可以被非注射?]( http://stackoverflow.com/questions/39219257/can-a-dagger-2-dependency-be-non-injectable) –

回答

3

实现这一目标最简单的方法是用一个@Qualifier是无法访问的绑定,你不希望被提供(在这种情况下BC)的类型。

然后,虽然BC可能可以从模块外部访问,但为了注入它们,您需要提供一个限定符,而不是。

@Module 
public final class SampleModule { 
    @Qualifier 
    @Retention(RUNTIME) 
    private @interface SampleModuleOnly {} 

    @Provides 
    @Singleton 
    static A provideA(@SampleModuleOnly B b, @SampleModuleOnly C c){ 
    return new A(b, c); 
    } 

    @Provides 
    @SampleModuleOnly 
    @Singleton 
    static B provideB(){ 
    return new B(); 
    } 

    @Provides 
    @SampleModuleOnly 
    @Singleton 
    static C provideC(){ 
    return new C(); 
    } 
} 
+0

好的这个工程,但与所有提供的依赖标记'@命名'注释混淆。它恰好也是一个限定符,你不能在'provideXXX'方法中有两个限定符。 –

+1

是的,这是将自定义限定符更改为'@ Named'的众多原因之一。 – gk5885