2013-05-16 52 views
13

我是新来的匕首(尽管我有使用Weld的Java EE WebApps的工作经验)。Android Dagger依赖注入在私人领域失败

我想要做的是向类中注入一个依赖项。该领域是私人的。

匕首然后抛出一个异常,说明它不能注入私人领域。

这是什么原因?

毕竟这是可以编写使用反射,即使在Android的私有字段..

如果我设置领域的知名度,其他的东西比私人注射似乎工作。

回答

16

制作一个私人领域“包可见”可能并不总是你想要的。匕首文档建议如下:

注入最终字段和私人成员。为获得最佳性能 Dagger生成代码。通过使用构造函数 注入解决此问题。

下面是一个例子:

private ItemFactoryImpl itemFactory; 
private BuildingFactory buildingFactory; 

@Inject 
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) { 
    this.itemFactory = itemFactory; 
    this.buildingFactory = buildingFactory; 
} 
+0

不错,谢谢你的输入。构造函数注入是我习惯于与CDI一起工作的东西.. –

+7

这适用于可构造类型,但Activity,Application,Fragment等Android OS类型不打算由除Android框架之外的任何东西构造,因此字段注入仍然是在这些情况下需要。但是,如果您对构造函数有控制权,这是一个很好的建议。 –

1

只是删除private设置您的字段的可见性包装友好

匕首不支持注入专用字段。

31

匕首不能支持专用字段,仍然支持代码生成的适配器(以避免反射)。像Guice这样的系统支持私人领域,他们在访问领域之前会反射性地改变对领域的访问。由于匕首在与要注入的类相同的包中生成InjectAdapter,因此它可以访问软件包友好的,受保护的或公共的字段。它不能访问私人领域。

Dagger的优点之一就是避免了反射,所以使用反射绕过场可视性并不是一个理想的功能。

+0

对我来说很有意义。将此标记为正确答案。谢谢 ! –

+0

随时。 :)随时也可以投票。 ;) –