将限定符传递给提供者方法

时间:2017-10-20 13:18:28

标签: dependency-injection dagger-2

我有一个自定义限定符,它带有参数 - 枚举值。枚举值包含特定于所需实例构造的信息。

如果我要向枚举添加新值,它会导致模块中的相同样板代码,如下所示:

限定符(爪哇):

@Documented
@Qualifier
@Retention(RUNTIME)
public @interface Format {
Type value() default SYSTEM;

enum Type {
    UI("dd-MM-yyyy HH:mm"),
    UI_DATE("EEEE,\u00A0dd MMMM yyyy"),
    .
    .
    .

    private String format;

    public String getFormat() {
        return format;
    }

    Type(String formatString) {
        format = formatString;
    }
}
}

模块(科特林):

@Module
class DateTimeModule {

@Provides
@Format(Format.Type.UI)
fun dateTimeFormatterUI(): DateTimeFormatter {
    return DateTimeFormat.forPattern(Format.Type.UI.format).withLocale(DefaultConfigVariables.LOCALE)
}

@Provides
@Format(Format.Type.UI_DATE)
fun dateFormatterUI(): DateTimeFormatter {
    return DateTimeFormat.forPattern(Format.Type.UI_DATE.format).withLocale(DefaultConfigVariables.LOCALE)
}

.
.
.

}

是否有可能以某种方式更改它我只能在枚举中添加一个新实例并将其传递给提供者方法或类似的东西?

1 个答案:

答案 0 :(得分:1)

不仅仅是通过Dagger。除非您将一个模块编码为Dagger,否则它将无法以编程方式读取您的注释并根据这些值采取不同的操作。

实际上,虽然它会使得得墨忒耳法则出现问题,但我会这样做:

public class DateTimeFormatterFactory {
  @Inject DateTimeFormatterFactory() {}

  public DateTimeFormatter forFormat(Format.Type type) {
    return DateTimeFormat
        .forPattern(type)
        .withLocale(DefaultConfigVariables.LOCALE);
  }
}