如何像在 Spring 中那样在 Dagger 中注入列表或集合?

Dim*_*tri 2 java dependency-injection dagger

一切都在问题中。例如,对于包含 String 列表的 Foo 类:

public class Foo {

 private List<String> fooList;

 //getter and setter

}
Run Code Online (Sandbox Code Playgroud)

在 XML 中,我们可以执行以下操作:

<bean id="foo" class="Foo">
  <property name="fooList">
     <list>
        <value>bar</value>
        <value>baz</value>           
    </list>
</property>
Run Code Online (Sandbox Code Playgroud)

Mig*_*gne 6

使用 Dagger,您需要将您的fooList变成Foo类的依赖项。你可以通过用 注释它来做到这一点@Inject。这将告诉 Dagger,当Foo由 Dagger 创建时,也List<String> fooList需要注入。请记住,fooList在我的示例中不是私有的。因为 Dagger 不使用反射而是使用代码生成,所以您必须将可注入字段声明为公共或私有范围。

public class Foo {

    @Inject
    @Named("FooDependency")
    List<String> footList;

    // getter and setter

}
Run Code Online (Sandbox Code Playgroud)

在这里,由于 List 是一种常见类型,我们用@Named("FooDependency")其中“FooDependency”可以是您想要的任何字符串对其进行注释。我们这样做是因为您完全有可能希望List<String>在应用程序中的其他位置注入另一个,我们希望能够区分这两个。另一个List<String>可以用@Named("ADifferentDependency")例如注释。

然后,您需要@Provide在其中一个模块中注释一个方法,该方法将负责提供该依赖项。

@Module(injects = Foo.class)
public class SomeModule {
    @Provide
    @Named("FooDependency")
    public List<String> provideFooDependencyListOfString() {
        return Arrays.asList("1", "2", "3");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它

ObjectGraph objectGraph = ObjectGraph.create(new SomeModule());
Foo foo = objectGraph.get(Foo.class);
Run Code Online (Sandbox Code Playgroud)