注入实例时,将参数传递给提供商方法



我是dagger。

@Module
public class MyModule {
  @Provides
  Student provideStudent(String name) {
    return new Student(name); 
  }
}

注射学生时如何通过参数name@Inject Student student?但是我在哪里/如何通过?

在哪里传递name

您想将对象(String name)作为参数提供给组件的参数,以便其他部件可以使用它。您基本上有2个选择。

模块构造函数参数

使用模块参数是您在引入Component.Builder之前将使用的"经典"方法。

您要做的就是将所需的内容添加到模块构造函数,然后从模块提供。

@Module
public class MyModule {
  private String name;
  MyModule(String name) {
    this.name = name;
  }
  // -----------------------------------------------
  // you could obviously just use the field directly
  @Provides
  Student provideStudent() {
    return new Student(name); 
  }

  // ---------------------------------------------------------------------
  // alternatively you'd add a Qualifier and add the argument to the graph
  @Provides
  @Named("name")
  String provideName() {
    return name; 
  }
  // then you can use it...
  @Provides
  Student provideStudent(@Named("name") String name) {
    return new Student(name); 
  }
}

直接使用该名称的第一个选项意味着仅在中可用模块。如果要使用构造函数注入或使用合格的字符串,则必须将其添加到图表中,如下所示。

使用两种方法,您必须手动将模块添加到组件中,因为该模块不再使用默认构造函数。这是您现在还提供论点的地方。

DaggerMyComponent.builder()
        .myModule(new MyModule("some name"))
        .build();

组件构建器

相同的概念,但另一种方法是使用组件构建器来实现相同的东西绑定到图形。

@Component(modules = MyModule.class)
interface MyComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance Builder name(@Named("name") String name);
        MyComponent build();
    }
}
@Module
class MyModule {
    @Provides
    Student provideStudent(@Named("name") String name) {
        return new Student(name);
    }
}

在这里,您也只需在可以使用的图表中添加一个对象即可。在这里,您也必须将其添加到组件构建器

DaggerMyComponent.builder()
        .name("some name")
        .build();

我的问题是如何将学生实例注入一个名称 硬编码。

nameStudent的依赖性,并且解决了这种依赖性。为此,您需要一个注释的@Provid E方法,该方法返回该String。由于类型通常是由返回类型推断的,因此,如果String,您还必须使用注释@Named

@Provides
@Named("Name")
public String provideName() {
    return "My name";
}

并更改您的方法

@Provides
Student provideStudent(@Named("Name") String name) {
   return new Student(name); 
}

这样的方式,dagger2知道ho以解决 String构建 Student

而不是直接注入Student,可以创建Student工厂并注入它:

public class Student {
    public Student(String name, Knowledge knowledge) {}
    public static class Factory {
        private Knowledge knowledge;
        @Inject
        public Factory(Knowledge knowledge) {
            this.knowledge = knownledge;
        }
        public Student create(String name) {
            return new Student(name, knowledge);
        }
    }
}

或Kotlin中的相同代码:

class Student(name: String, knowledge: Knowledge) {
    class Factory @Inject constructor(private val knowledge: Knowledge) {
        fun create(name: String) = Student(name, knowledge)
    }
}

这允许在Student实例化上传递name参数,因此:

public class MyClass {
    @Inject
    public Student.Factory studentFactory;
    private Student student;
    public void setupStudent() {
        this.student = studentFactory.create("Student's name");
    }
}

相关内容

最新更新