使用Dagger2提供不同的对象实例化

时间:2016-06-24 10:40:20

标签: android dagger-2

我遇到Dagger2的问题如下:

我有一个XML Serializer,它接收格式,策略和匹配器。我的问题是格式可以是以下之一:

new Format()
new Format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")

我解决此问题的方法是创建Qualifier接口,如下所示:

@Qualifier @Retention(RUNTIME) public @interface NoFormat {}

@Qualifier @Retention(RUNTIME) public @interface WithFormat {}

[Edit:] // @Qualifier @Retention(RUNTIME) public @interface FormatSerializer {} <- This was unecessary

[Edit:] // @Qualifier @Retention(RUNTIME) public @interface NoFormatSerializer {} <- This was unecessary

然后指定每个限定符的不同实现:

@Provides @Singleton @WithFormat Format provideWithFormat() {
     return new Format(XML_PROLOG);
}

@Provides @Singleton @NoFormat Format provideNoFormat() {
     return new Format();
}

@Provides @Singleton @WithFormat
Serializer provideFormattedSerializer(Strategy strategy, @WithFormat Format format,RegistryMatcher matcher) {
     return new Persister(strategy, matcher, format);
}

@Provides @Singleton @NoFormat
Serializer provideNoFormatSerializer(Strategy strategy, @NoFormat Format format,RegistryMatcher matcher) {
     return new Persister(strategy, matcher, format);
}

@Provides @Singleton
Retrofit provideRestAdapter(@WithFormat Serializer serializer) {}

@Provides @Singleton
XmlApiSerializer provideXmlApiSerializer(@NoFormat Serializer serializer) {}

这是正确的做法吗?我觉得这太过分了......我尝试了不同的方法,但我从来没有告诉匕首他应该为每个案例使用哪种实施方式。这是我唯一的“成功”案例。

您对此有何看法?可以改进吗?怎么样?

编辑:我意识到我正在使用不需要的2个限定符。现在我只有withformat和noformat限定符

1 个答案:

答案 0 :(得分:1)

可以通过委派给不同的组件来创建相关对象的小图。以下是处理FormatSerializer

的处理方式
@Component(modules = {FormatModule.class, SerializerModule.class})
interface SerializerHelperComponent {
  Serializer serializer();
}

@Module
final class FormatModule {
  private final Format format;

  FormatModule (Format format) {
    this.format = format;
  }

  @Provides Format format() {
    return format;
  }
}

@Module
final class SerializerModule {
  /** This @Provides method doesn't need the qualifier! */
  @Provides static provideSerializer(
      Strategy strategy, 
      Format format,
      RegistryMatcher matcher) {
    return new Persister(strategy, matcher, format);
  }
}

现在,在您原来的@Provides方法中,您可以创建一个新的帮助程序组件,以使用您选择的格式连接所有内容。

@Provides @Singleton @WithFormat
Serializer provideFormattedSerializer(
    Strategy strategy,
    Format format,
    RegistryMatcher matcher) {
 return DaggerSerializerHelperComponent.builder()
     .formatModule(new FormatModule(return new Format())
     .build()
     .serializer();
 }

只有一个绑定,这绝对不值得麻烦,但如果有一个复杂的图形将在助手组件中创建以获得输出,那么它可能是值得的。这绝对是一种判断。