如何使用匕首 2 注入 pojo 依赖项?

How to inject pojo dependencies using dagger 2?

我有一个简单的 pojo class:

public class MySimpleClass {

    private List<String> mDependency;

    public MySimpleClass (List<String> dependency) {
        mDependency = dependency;
    }
}

我正在尝试使用 Dagger 2 使用依赖注入创建它。现在我有一个简单的模块和组件:

@Module
public class MySimpleClassModule {

    @Provides
    MySimpleClass provideMySimpleClass(List<String> dependency) {
        return new MySimpleClass(dependency);
    }
}

@Component(modules={MySimpleClassModule.class})
public interface MySimpleClassComponent {
}

但我不确定每次需要创建 MySimpleClass 的新实例时如何注入 List<String> 依赖项。在上面的场景中,似乎我实际上需要将 List<String> 添加到 MySimpleClassModule 的构造函数中,并且每次我需要 MySimpleClass 的新实例时都有一个该模块的新实例新 List<String>。那是对的吗?在这种特殊情况下,开销似乎很大。

如果要定义对象的构造函数,最好使用 @Inject 构造函数。 Dagger 2 会自动知道如何实例化对象,因此您不需要 @Provides 模块中的注释方法。

public class MySimpleClass {

    private List<String> mDependency;

    @Inject
    public MySimpleClass (List<String> dependency) {
        mDependency = dependency;
    }
}

Dagger 会假定构造函数的参数是依赖项,并尝试从依赖图中解析它们。请注意,每个 class 只能有一个 @Inject 带注释的构造函数!如果您不能自己实例化对象(例如 Android Activities/Fragments),则需要使用字段注入。

在您的情况下,似乎没有必要将空列表注入 MyClass。您可以在构造函数中实例化列表。但是,当您想将 MyClass 注入另一个对象时,它已经在对象图中了。

不,不是。

我假设您遇到了 Dagger 的编译错误,因为从问题上看,您不清楚是否已经有提供此字符串列表的模块。

要解决这个问题,您只需:

@Module
public class MySimpleClassModule {

    @Provides
    List<String> provideListDependency() {
        return Arrays.asList("One", "Two");
    }

    @Provides
    MySimpleClass provideMySimpleClass(List<String> dependency) {
        return new MySimpleClass(dependency);
    }
}

如果您认为提供此列表应该是其他模块的一部分,您可以移动它。最主要的是,Dagger 在编译期间能够找到如何获得此依赖项。

如果你不想在上面创建这个数组,你可以将方法标记为 @Singlethon 这样 dagger 就会缓存它。

class A {
    String name;
    @Inject
    A(String name) {
        this.name = name;
    }


    @Component
    interface AComponent {
        A getA();
        @Component.Builder
        interface Builder {
            @BindInstance
            Builder provideName(String name);
            A build();
        }
    }